首先写一个原始的 Promise
let OP = new promise((res,rej) =>{res(0)})op.then((val) =>{console.log(val)},(rej) =>{console.log(reason)})
ES5 模拟
function MyPromise(executor){this.status = 'pending';var _self = this;_self.resolveValue = null;_self.rejectValue = null;function resolve(val){if(_self.status == 'pending'){_self.status = 'Fulfilled';_self.resolveValue = val}}function reject(reason){if(_self.status == 'pending'){_self.status = 'Rejected';_self.rejectValue = reason;}}try{executor(resolve, reject);}catch(e){reject(e);}executor(resolve, reject);}MyPromise.prototype.then = function(onFulfilled,onRejected){var self = this;if(self.status == 'Fulfilled'){onFulfilled(_self.resolveValue);}if(self.status == 'Rejected'){onRejected(_self.rejectValue);}}
异步操作
function MyPromise(executor){this.status = 'pending';var _self = this;_self.resolveValue = null;_self.rejectValue = null;_self.ResolveCallBackList = [];_self.RejectCallBackList = [];function resolve(val){if(_self.status == 'pending'){_self.status = 'Fulfilled';_self.resolveValue = val_self.ResolveCallBackList.forEach(function(ele){ele();})}}function reject(reason){if(_self.status == 'pending'){_self.status = 'Rejected';_self.rejectValue = reason;_self.RejectCallBackList.forEach(function(ele){ele();})}}try{executor(resolve, reject);}catch(e){reject(e);}executor(resolve, reject);}MyPromise.prototype.then = function(onFulfilled,onRejected){var self = this;if(self.status == 'Fulfilled'){onFulfilled(_self.resolveValue);}if(self.status == 'Rejected'){onRejected(_self.rejectValue);}//if(self.status == 'pending'){self.ResolveCallBackList.push(function(){onFulfilled(_self.resolveValue);})self.RejectCallBackList.push(function(){onRejected(_self.rejectValue);})}}
链式调用
function MyPromise(executor){this.status = 'pending';var _self = this;_self.resolveValue = null;_self.rejectValue = null;_self.ResolveCallBackList = [];_self.RejectCallBackList = [];function resolve(val){if(_self.status == 'pending'){_self.status = 'Fulfilled';_self.resolveValue = val_self.ResolveCallBackList.forEach(function(ele){ele();})}}function reject(reason){if(_self.status == 'pending'){_self.status = 'Rejected';_self.rejectValue = reason;_self.RejectCallBackList.forEach(function(ele){ele();})}}try{executor(resolve, reject);}catch(e){reject(e);}executor(resolve, reject);}MyPromise.prototype.then = function(onFulfilled,onRejected){var self = this;var nextPromise = new MyPromise(function(res, rej){if(self.status == 'Fulfilled'){var nextResolveValue = onFulfilled(_self.resolveValue);res(nextResolveValue)}if(self.status == 'Rejected'){var nextRejectValue = onRejected(_self.rejectValue);res(nextRejectValue);}//if(self.status == 'pending'){self.ResolveCallBackList.push(function(){var nextResolveValue = onFulfilled(_self.resolveValue);res(nextResolveValue)})self.RejectCallBackList.push(function(){var nextRejectValue = onRejected(_self.rejectValue);res(nextRejectValue);})}})return nextPromise;}
