juejin.cn/post/684490…
setTimeout(() => {
console.log('0')
})
new Promise((resolve, reject) => {
console.log('1')
resolve()
}).then(() => {
console.log('2')
new Promise((resolve, reject) => {
console.log('3')
resolve()
}).then(() => {
console.log('4')
}).then(() => {
console.log('5')
})
}).then(() => {
console.log('6')
})
new Promise((resolve, reject) => {
console.log('7')
resolve()
}).then(() => {
console.log('8')
})
promise原理
function myPromise(executor){
var self = this;
self.status = 'pending';
self.resolveValue = null;
self.rejectReason = null;
self.ResolveCallBackList = [];
self.RejectCallBackList = [];
function resolve(value){
if(self.status === 'pending'){
self.status = "Fulfilled";
self.resolveValue = value;
console.log(self.RejectCallBackList)
self.ResolveCallBackList.forEach((ele) => {
ele();
});
}
}
function reject(reason){
if(self.status === 'pending'){
self.status = 'Rejected';
self.rejectReason = reason;
self.RejectCallBackList.forEach((ele) => {
ele();
});
}
}
try{
executor(resolve,reject);
}catch(e){
reject(e);
}
}
function ResolutionReturnPromise(nextPromise,returnValue,res,rej){
if(returnValue instanceof myPromise){
returnValue.then((val) => {
res(val);
},(reason) => {
rej(reason);
});
}else{
res(returnValue);
}
}
myPromise.prototype.then = function(onFulfilled,onRejected){
var self = this;
if(!onFulfilled){
onFulfilled = function(val){
return val;
}
}
if(!onRejected){
onRejected = function(reason){
throw new Error(reason);
}
}
console.log(self.status,'---');
var nextPromise = new myPromise((res,rej) => {
if(self.status == 'Fulfilled'){
setTimeout(function(){
try{
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionReturnPromise(nextPromise,nextResolveValue,res,rej)
}catch(e){
rej(e);
}
},0);
}
if(self.status == 'Rejected'){
setTimeout(function(){
try{
var nextRejectValue = onRejected(self.rejectReason);
ResolutionReturnPromise(nextPromise,nextRejectValue,res,rej)
}catch(e){
rej(e);
}
},0);
}
if(self.status == 'pending'){
self.ResolveCallBackList.push(() => {
setTimeout(function(){
try{
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionReturnPromise(nextPromise,nextResolveValue,res,rej)
}catch(e){
rej(e);
}
},0);
});
self.RejectCallBackList.push(() => {
setTimeout(function(){
try{
var nextRejectValue = onRejected(self.rejectReason);
ResolutionReturnPromise(nextPromise,nextRejectValue,res,rej)
}catch(e){
rej(e);
}
},0);
});
}
})
return nextPromise;
}
myPromise.race = function(promiseArr){
return new myPromise(function(resolve,reject){
promiseArr.forEach(function(promise,index){
promise.then(resolve,reject);
})
});
}
myPromise.all = function(promiseArr){
var counter = 0;
var arrList = [];
return new myPromise(function(resolve,reject){
promiseArr.forEach(function(promise,index){
promise.then((x) => {
counter ++;
arrList.push(x);
if(counter == promiseArr.length){
resolve(arrList);
}
},(x) => {
reject(x);
});
})
});
}
new myPromise((resolve, reject) => {
console.log('1')
resolve()
}).then(() => {
console.log('2')
})
.then(() => {
console.log('6')
})
.then(() => {
console.log('10')
})
new myPromise((resolve, reject) => {
console.log('7')
resolve()
}).then(() => {
console.log('8')
}).then(() => {
console.log('9')
})