SOURCE

function Promise (executor){
	this.promiseState = 'pending';
	this.promiseResult = null;
	this.callbackList = [];
	const resolve = val => {
		if(this.promiseState !== 'pending') return;
		this.promiseState = 'fulfilled';
		this.promiseResult = val;
		for(let callback of this.callbackList){
			callback.onResolved(val);
		}
	}
	const reject = err => {
		if(this.promiseState !== 'pending') return;
		this.promiseState = 'rejected';
		this.promiseResult = err;
		for(let callback of this.callbackList){
			callback.onRejected(err);
		}
	}
	try{
		executor(resolve,reject);
	}catch(err){
		reject(err);
	}
}

Promise.prototype.then = function(onResolved,onRejected){
	const self = this;
	return new Promise((resolve,reject)=>{
		const handleCallback = (callback)=>{
			try{
				const res = callback(self.promiseResult);
				if(res instanceof Promise){
					res.then(val => {
						resolve(val);
					},err => {
						reject(err)
					})
				}else{
					resolve(res)
				}
			}catch(err){
				reject(err)
			}
		}
		if(this.promiseState == 'fultilled'){
			handleCallback(onResolved);
		}
		if(this.promiseState == 'rejected'){
			handleCallback(onRejected);
		}
		if(this.promiseState == 'pending'){
			this.callbacklist.push({
				onResolved:()=>{
					handleCallback(onResolved);
				},
				onRejected:()=>{
					handleCallback(onRejected);
				},
			})
		}
	})
}

Promise.prototyp.catch = function(onRejected){
	return this.then(undefined,onRejected);
}

Promise.resolve = function (val){
	return new Promise((resolve,reject) => {
		if(val instanceof Promise){
			val.then(val => {
				resolve(val);l
			})
		}else{
			resolve(value);
		}
	})
}

Promise.reject = function(err){
	return new Promise((resolve,reject) => {
		reject(err);
	})
}

Promise.all = function(promiseList){
	let count = 0;
	let res = [];
	const length = promiseList.length;
	return new Promise((resolve,reject) => {
		for(let i=0;i<length;i++){
			promiseList[i].then(val => {
				count ++;
				res[i] = val;
				if(count == length){
					resolve(res);
				}
			},err => {
				reject(err);
			})
		}
	})
}

Promise.race = function(promisList){
	const length = promiseList.length;
	return  new Promise((resovle,reject)=>{
		for(let i=0;i<length;i++){
			promiseList[i].then(val => {
				resolve(val)
			},err => {
				reject(err)
			})
		}
	})
}
console 命令行工具 X clear

                    
>
console