手書きPromise,1.5 promiseでthenメソッドのチェーン呼び出しPromiseオブジェクト自体を識別する

2693 ワード

promiseのthenメソッドはpromiseオブジェクトを返します.ユーザーがコードを書く過程で、自分自身を返すと、タイプエラーが報告されます.テストコード:




    
    
    Promise.then 



    
        var p = new Promise(function (resolve, reject) {
            resolve(100);
        })
        var p1 = p.then(function (value) {
            console.log(value)
            return p1;
        })
        p1.then(function () {}, function (resson) {
            console.log(resson.message)
        })
    



コンソールに次のように印刷し、ループコールをプロンプトします.
100
Chaining cycle detected for promise #

そのため、前のコードで必要な判断をする必要があります.自分自身を返す場合は、タイプエラーを報告します.resolvePromiseメソッドにパラメータを追加し、thenメソッドでpromiseオブジェクトを返します.
function resolvePromise(promise2, e, resolve, reject) {
    if (promise2 === e) {
        return reject(new TypeError("Chaining cycle detected for promise #"))
    }
    if (e instanceof MyPromise) {
        // promise 
        // e.then((value) => {
        //     resolve(value)
        // }, (reason) => {
        //     reject(reason)
        // })
        //  
        e.then(resolve, reject);
    } else {
        // 
        resolve(e);
    }
}

しかし、このコードには問題があり、resolvePromiseメソッドはthenメソッドのpromiseのアクチュエータに存在する.彼の最初のパラメータはpromiseオブジェクトの戻り値であり、resolvePromiseはこの戻り値を取得できません.これは明らかに問題があります.解決策はthenメソッドで状態を判断した後の論理コードを非同期コードにプログラミングし,すべての同期を先に実行させpromise戻り値が存在することである.このとき、resolvePromiseは、new Promiseの戻り値を取得することができる.
            if (this.status === FULFILLED) {
                setTimeout(() => {
                    //  , then 
                    let successRtn = successCallback(this.value);
                    //   x  promise 
                    //    resolve 
                    //  promise   promsie  
                    //  promise   resolve  reject
                    //  resolve , then 
                    resolvePromise(promise2, successRtn, resolve, reject);
                }, 0);
            } 

テストコードを修正します
let promise = new MyPromise((resolve, reject) => {
    resolve('---success----');
})

let p1 = promise.then(value => {
    console.log(value);
    return p1;
}, reason => {
    console.log(reason)
})

p1.then(value => {
    console.log(value)
},reason=>{
    console.log(reason)
})

コンソール印刷
---success----
TypeError: Chaining cycle detected for promise #

テストに成功しました.