通常,當 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,但unhandled promise rejection我們的err承諾沒有錯誤。
我試圖了解所有那些被拒絕的承諾會發生什么,因此問題。
我們可能最終會得到一堆松散的 Promise,它們繼續在后臺運行,沒有任何錯誤處理,也沒有任何關于未處理的 Promise 拒絕的報告。這似乎有點危險。
舉個例子。我試圖combine為異步迭代器(類似于this)實作邏輯,這需要使用Promise.race,同時跟蹤傳遞給它的任何引數的拒絕,因為該combine函式需要在下一個請求時拒絕。
uj5u.com熱心網友回復:
通常,當 JavaScript 中的 Promise 不經處理就拒絕時,我們會得到
unhandled promise rejection錯誤。
是的,這發生在一個從未被.then()呼叫來安裝處理程式的承諾被拒絕時,即一個鏈的最終承諾。
但是所有被
Promise.race邏輯忽略的被拒絕的承諾會發生什么?他們為什么不拋出同樣的錯誤?
在Promise.race不呼叫.then()在其引數中的所有承諾,將它們標記為處理:
Promise.race = function(promises) {
return new Promise((resolve, reject) => {
for (const promise of promises) {
promise.then(resolve, reject);
}
});
};
請注意,當外部承諾已經解決時,它不會重新拋出錯誤,它只是被忽略了。這是設計使然:在使用時Promise.race,您宣告您只對第一個結果感興趣,其他所有結果都可以丟棄。導致未在應用程式崩潰的競賽中獲勝的承諾拒絕未處理的承諾將是相當具有破壞性的。
uj5u.com熱心網友回復:
來自MDN:
Promise.race() 方法回傳一個承諾,一旦可迭代物件中的一個承諾履行或拒絕,該承諾就會履行或拒絕,并帶有該承諾的值或原因。
您的代碼實作是因為更快的 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);
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/384938.html
標籤:javascript 节点.js 承诺
上一篇:僅在.includes()使用.find()找到某些內容時才回傳值
下一篇:限制輸入欄位與另一個欄位的比較
