首先写一个原始的 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;
}