簡體   English   中英

Promise.race 中被拒絕的承諾會發生什么?

[英]What happens to rejected promises inside Promise.race?

通常,當 JavaScript 中的 Promise 未經處理而拒絕時,我們會收到unhandled promise rejection錯誤。

但是, Promise.race邏輯忽略的所有被拒絕的承諾會發生什么? 他們為什么不拋出同樣的錯誤?

考慮以下測試:

const normal = new Promise((resolve, reject) => {
    setTimeout(() => resolve(123), 100);
});

const err = new Promise((resolve, reject) => {
    setTimeout(() => reject('ops'), 500);
});

const test = Promise.race([normal, err]);

test.then(data => {
    console.log(data);
});

上面的測試僅輸出123 ,但沒有針對我們的err promise 的unhandled promise rejection錯誤。

我試圖了解所有那些被拒絕的承諾會發生什么,因此是這個問題。

我們最終可能會得到一堆在后台繼續運行的松散承諾,沒有任何錯誤處理,也沒有任何關於未處理的 promise 拒絕的報告。 這似乎有點危險。


舉個例子。 我試圖為異步迭代實現combine邏輯(類似於this ),這需要使用Promise.race ,同時跟蹤傳遞給它的任何參數的拒絕,因為combine function 需要拒絕下一個請求.

通常,當 JavaScript 中的 Promise 未經處理而拒絕時,我們會收到unhandled promise rejection錯誤。

是的,當一個 promise 被拒絕時會發生這種情況,而該 promise 從未調用過 .then .then()來安裝處理程序,即一個鏈的最后一個 promise。

(請注意.catch(onRejected)內部委托 tot .then(undefined, onRejected) ,因此 promise 被標記為處理相同。)

但是, Promise.race邏輯忽略的所有被拒絕的承諾會發生什么? 他們為什么不拋出同樣的錯誤?

Promise.race確實在其參數中的所有承諾上調用 .then .then() ,將它們標記為已處理:

Promise.race = function(thenables) {
    return new Promise((resolve, reject) => {
        for (const thenable of thenables) {
            Promise.resolve(thenable).then(resolve, reject);
        }
    });
};

請注意,當外部 promise 已經解決時,它不會重新引發錯誤,它只是被忽略了。 這是設計使然:使用Promise.race時,您只對第一個結果感興趣,而其他所有內容都可以丟棄。 導致未處理的 promise 拒絕未贏得比賽的承諾會導致您的應用程序崩潰,這將是相當具有破壞性的。

來自MDN

Promise.race() 方法返回一個 promise,一旦可迭代中的一個承諾履行或拒絕,就會履行或拒絕,其值或原因來自該 promise。

您的代碼可以實現,因為更快的 promise 調用resolve 交換它們,它會拒絕。

 const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 500, 'one'); }); const promise2 = new Promise((resolve, reject) => { setTimeout(reject, 100, 'two'); }); Promise.race([promise1, promise2]).then((value) => { console.log(value); }).catch((value) => { console.log('error ', value); });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM