亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Promise中返回Promise為什么會立即執行?請大牛解釋下原理謝謝

Promise中返回Promise為什么會立即執行?請大牛解釋下原理謝謝

泛舟湖上清波郎朗 2018-11-09 23:19:41
下面是代碼    function retPromise(str) {        return new Promise(resolve=>{            resolve(str);        })    }        console.log(retPromise("first")) // 返回一個Promise對象        retPromise("x").then(str=>{        return retPromise("first")    }).then(str=>{        console.log(str) // 返回"first"    })為什么在then中return Promise對象,在下一個then中被resolve了?第二個then的執行鏈是不是第二個Promise的?
查看完整描述

1 回答

?
躍然一笑

TA貢獻1826條經驗 獲得超6個贊

Promise的思想就是把所有同步和異步的代碼都視為異步代碼,then方法內部會返回一個新的Promise(鏈式調用),then方法的第一個參數onfulfilled是在前一個Promise對象的異步調用完成之后調用的

    then(onfulfilled, onrejected){

            // 每個then方法都返回一個新的promise對象,實現鏈式調用


            return new Promise((resolve, reject)=>{


                let success = (value)=>{

                    // 這里執行onFulfilled,判斷是否是promise對象并將返回結果作為參數傳遞到當前promise的reslove中

                    // 如果沒有返回值,則默認返回原本的value值,這一步的處理并不是必須的

                    let result = onfulfilled(value) || value;

                    if (isThenable(result)){

                        result.then((value)=>{

                            resolve(value);

                        }, (value)=>{

                            reject(value);

                        });

                    }else {

                        resolve(result);

                    }

                }


                let error = (value)=>{

                    let result = onrejected(value) || value;

                    resolve(result);

                }

                

                // 當調用then方法的那個promise對象onfulfilled時調用success,執行上面的操作

                switch(this.status){

                    case PENDING:

                        this.onfulfilled = success;

                        this.onrejected = error;

                        break;

                    case FULFILLED:

                        success(this.value);

                        break;

                    case REJECTED:

                        error(this.reason);

                        break;

                }

                

            })

        }

這里還是牽扯到Promise構造函數內部的一些實現,剛好前幾天實現了一個簡單的Promise,這里是傳送門,希望對您有所幫助

查看完整回答
反對 回復 2018-12-17
  • 1 回答
  • 0 關注
  • 3690 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號