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

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

Promise的一道面試題,麻煩指導一下!

Promise的一道面試題,麻煩指導一下!

江戶川亂折騰 2019-03-05 18:15:30
最近在看Promise相關知識,遇到一個面試題,以我的理解,應該是先輸出a failed,然后b failed b passed的,可是為什么a failed在中間輸出了??
查看完整描述

5 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

強調:Promise的每個then或catch都是異步執行的。


因此,實際上最先執行的是a.then,但沒有定義catch,所以拋出異常,然后異步交給后面的catch處理(a failed)。此時下一個等待執行的是b.catch(b failed),處理完之后,同樣異步交給后面的then(b passed)。接著,之前排隊的catch(b failed)執行,最后b passed執行。


這就是各個then/catch交替執行的原因。


整個過程類似于下面的代碼:


setTimeout(function(){

    console.log(1);

    setTimeout(function(){

        console.log(2);

    }, 0);

}, 0);


setTimeout(function(){

    console.log(3);

    setTimeout(function(){

        console.log(4);

    }, 0);

}, 0);

結果打印1 3 2 4,而不是1 2 3 4。


查看完整回答
反對 回復 2019-03-21
?
開心每一天1111

TA貢獻1836條經驗 獲得超13個贊

catch 本質也是 Promise.prototype.then 的封裝,所以 a 相當于跳過了一輪循環,整個過程可以這么理解


reject('a')

reject('b')


(next turn)


reject('a') -> handle(onReject) 沒 handler,傳遞下去

reject('b') -> handle(onReject) 這里被 catch 處理


(next turn)


reject('a') -> handle(onReject) -> handle(onReject) 這里被 catch 處理

reject('b') -> handle(onReject) -> handle(onFullfill)


查看完整回答
反對 回復 2019-03-21
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

此句是錯的 catch對于已經完成的promise同步執行 此句是錯的

then異步執行(類型setTimeout(xxx,0))


查看完整回答
反對 回復 2019-03-21
  • 5 回答
  • 0 關注
  • 448 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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