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。

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)
添加回答
舉報