Promise实现

28 阅读1分钟
function MyPromise(executor) {
    this.onResolveCallbacks = [];   // 成功回调
    this.onRejectCallbacks = [];    // 失败回调
    this.status = "pending";        // 状态
    this.result = undefined;        // 取值
    let self = this;                // resolve、reject函数闭包访问当前对象
​
​
​
    function resolve(v) {
        if (self.status === "pending") {
            self.status = "fulfilled"
            self.result = v;
            setTimeout(() => {      // 异步执行回调函数
                if (self.onResolveCallbacks[0]) {
                    let thenValue = self.onResolveCallbacks[0](v);
                    if (thenValue instanceof MyPromise) {
                        thenValue.then((resolveValue) => self.onResolveCallbacks[self.onResolveCallbacks.length - 1](resolveValue), (resolveValue) => self.onRejectCallbacks[self.onRejectCallbacks.length - 1](resolveValue))
                    } else {
                        self.onResolveCallbacks[self.onResolveCallbacks.length - 1](thenValue)
                    }
​
                }
            }, 0);
        }
​
​
    }
    function reject(v) {
        if (self.status === "pending") {
            self.status = "rejected";
            self.result = v;
            setTimeout(() => {      // 异步执行回调函数
                if (self.onRejectCallbacks[0]) {
                    let thenValue = self.onRejectCallbacks[0](v)
                    if (thenValue instanceof MyPromise) {
                        thenValue.then((resolveValue) => self.onResolveCallbacks[self.onResolveCallbacks.length - 1](resolveValue), (rejectValue) => self.onRejectCallbacks[self.onRejectCallbacks.length - 1](rejectValue))
                    } else {
                        self.onResolveCallbacks[self.onResolveCallbacks.length - 1](thenValue)
                    }
​
                }
            }, 0);
​
        }
    }
​
​
    try {
        executor(resolve, reject)
    } catch (error) {
        reject(error)
    }
​
​
}
​
​
MyPromise.prototype.then = function (onFulflled, onRejected) {  // then需要返回一个Promise
    let myResolve = undefined, myReject = undefined;
    let myPromise = new MyPromise((resolve, reject) => {        // 通过闭包获取Promise的resolve、reject函数
        myResolve = resolve;
        myReject = reject;
    })
​
    onFulflled && this.onResolveCallbacks.push(onFulflled);     // 将then回调添加进成功回调数组
    this.onResolveCallbacks.push(myResolve);                    // 将pending状态的resolve添加进成功的回调数组
​
​
    onRejected && this.onRejectCallbacks.push(onRejected);      // 将then回调添加进成功回调数组
    this.onRejectCallbacks.push(myReject);                      // 将pending状态的reject添加进失败的回调数组
​
​
    return myPromise                                            // 返回一个pending状态的Promise
}
​
MyPromise.prototype.catch = function (catchFun) {
    return this.then(undefined, catchFun)
}
​
​
​