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;
self.ResolveCallBackList.forEach(function (ele) {
ele();
});
}
}
function reject (reason) {
if (self.status === 'pending') {
self.status = 'Rejected';
self.rejectReason = reason;
self.RejectCallBackList.forEach(function (ele) {
ele();
});
}
}
try {
executor(resolve, reject);
}catch(e) {
reject(e);
}
};
function ResolutionRetrunPromise (nextPromise, returnValue, res, rej) {
if (returnValue instanceof MyPromise) {
// Promise 對(duì)象
returnValue.then(function (val) {
res(val);
}, function (reason) {
rej(reason)
});
}else {
res(returnValue);
}
}
MyPromise.prototype.then = function (onFulfilled, onRejected) {
if (!onFulfilled) {
onFulfilled = function (val) {
return val;
}
}
if (!onRejected) {
onRejected = function (reason) {
throw new Error(reason);
}
}
var self = this;
var nextPromise = new MyPromise(function (res, rej) {
if (self.status === 'Fulfilled') {
setTimeout(function () {
try {
// var nextResolveValue = onFulfilled(self.resolveValue);
// res(nextResolveValue);
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
}catch(e) {
rej(e);
}
}, 0);
}
if (self.status === 'Rejected') {
setTimeout(function () {
try {
var nextRejectValue = onRejected(self.rejectReason);
ResolutionRetrunPromise(nextPromise, nextRejectValue, res, rej);
}catch(e) {
rej(e);
}
}, 0);
}
//
if (self.status === 'pending') {
self.ResolveCallBackList.push(function () {
try {
var nextResolveValue = onFulfilled(self.resolveValue);
ResolutionRetrunPromise(nextPromise, nextResolveValue, res, rej);
}catch(e) {
rej(e);
}
});
self.RejectCallBackList.push(function () {
setTimeout(function () {
try {
var nextRejectValue = onRejected(self.rejectReason);
ResolutionRetrunPromise(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);
});
});
};
ES6-Promise原理
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 這個(gè)很早以前寫的,今天看群里有人問關(guān)于promise的問題,在這里重新發(fā)一下。偷懶的同學(xué)可以直接拉到最后有完整的代...
- 1. Promise 之前 1.1 回調(diào)函數(shù) 回調(diào)函數(shù):把函數(shù)A當(dāng)作參數(shù)傳遞給另一個(gè)函數(shù)B調(diào)用,那么A就是回調(diào)函數(shù)...
- Promise 根據(jù)官方Promise用法,結(jié)合個(gè)人思路,試著實(shí)現(xiàn)Promise,通過每次git提交,記錄自己的思...
- es6-promise demo: demo: es6-promise.auto demo: es6-promis...
- (1)ES6方式 http://liubin.github.io/promises-book/#promise-i...