https://juejin.im/post/5b2f02cd5188252b937548ab? 詳解
https://juejin.im/post/5cd8d76d5188256805093a9f
//Promise函數(shù)
function Promise(executor) {
? ? let self = this; //保留this。防止后面方法出現(xiàn)this只想不明的問(wèn)題
? ? self.status = 'pending'; //promise的默認(rèn)狀態(tài)是pending
? ? self.value= undefined; //保存成功回調(diào)傳遞的值
? ? self.error = undefined; //保存失敗回調(diào)傳遞的值
? ? self.onSuccessCallbacks = []; //存放成功的回調(diào)
? ? self.onErrorCallbacks = []; //存放失敗的回調(diào)
? ? function resolve(value) {
? ? ? ? if (self.status === 'pending') {
? ? ? ? ? ? self.status = 'resolved'; //成功函數(shù)將其狀態(tài)修改為resolved
? ? ? ? ? ? self.value= value; //將成功的值保存起來(lái)
? ? ? ? ? ? self.onSuccessCallbacks.forEach(fn=> {
? ? ? ? ? ? ? ? fn();
? ? ? ? ? ? });
? ? ? ? }
? ? }
? ? function reject(error) {
? ? ? ? if (self.status === 'pending') {
? ? ? ? ? ? self.status = 'rejected'; //失敗函數(shù)將其函數(shù)修改為rejected
? ? ? ? ? ? self.error = error; //將失敗的值保存起來(lái)
? ? ? ? ? ? self.onErrorCallbacks.forEach(fn=> {
? ? ? ? ? ? ? ? fn();
? ? ? ? ? ? })
? ? ? ? }
? ? }
? ? try {
? ? ? ? executor(resolve, reject);
? ? } catch (err) {
? ? ? ? reject(err);
? ? }
}
//then函數(shù)
Promise.prototype.then = function (onResolved, onRejected) {
? ? let self = this;
? ? let promiseAgain = new Promise((resolve, reject) => {
? ? ? ? if (self.status === 'pending') {
? ? ? ? ? ? self.onSuccessCallbacks.push(() => {
? ? ? ? ? ? ? ? ? ? let x = onResolved(self.value); //將resolve函數(shù)保留的成功值傳遞作為參數(shù)
? ? ? ? ? ? ? ? ? ? resolvePromise(promiseAgain, x, resolve, reject);
? ? ? ? ? ? })
? ? ? ? ? ? self.onErrorCallbacks.push(() => {
? ? ? ? ? ? ? ? ? ? let x = onRejected(self.error); //將reject函數(shù)保留的失敗值傳遞作為參數(shù)
? ? ? ? ? ? ? ? ? ? resolvePromise(promiseAgain, x, resolve, reject);
? ? ? ? ? ? })
? ? ? ? }
? ? ? ? if (self.status === 'resolved') {
? ? ? ? ? ? ? ? let x = onResolved(self.value); //將resolve函數(shù)保留的成功值傳遞作為參數(shù)
? ? ? ? ? ? ? ? resolvePromise(promiseAgain, x, resolve, reject);
? ? ? ? }
? ? ? ? if (self.status === 'rejected') {
? ? ? ? ? ? ? ? let x = onRejected(self.error); //將reject函數(shù)保留的失敗值傳遞作為參數(shù)
? ? ? ? ? ? ? ? resolvePromise(promiseAgain, x, resolve, reject);
? ? ? ? }
? ? })
? ? return promiseAgain;
}
//resolvePromise函數(shù)
function resolvePromise(promiseAgain, x, resolve, reject) {
? ? if (promiseAgain === x) {
? ? ? ? return reject(new TypeError("循環(huán)調(diào)用"));
? ? }
? ? if (x !== null && (typeof x === 'object' || typeof x === 'function')) {
? ? ? ? try {
? ? ? ? ? ? let then = x.then;
? ? ? ? ? ? if (typeof then === 'function') {
? ? ? ? ? ? ? ? then.call(x, (y) => {
? ? ? ? ? ? ? ? ? ? resolvePromise(promiseAgain, y, resolve, reject);
? ? ? ? ? ? ? ? }, (e) => {
? ? ? ? ? ? ? ? ? ? reject(e);
? ? ? ? ? ? ? ? })
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? resolve(x);
? ? ? ? ? ? }
? ? ? ? } catch (error) {
? ? ? ? ? ? reject(error);
? ? ? ? }
? ? } else {
? ? ? ? resolve(x);
? ? }
}
module.exports = Promise;