Promise.any()方法,該方法接受一組Promise實例作為參數,包裝成一個新的Promise實例返回,只要參數實例有一個變成fulfilled狀態,包裝實例就會變成fulfilled狀態。如果所有參數實例都會變成rejected狀態,包裝實例就會變成rejected狀態。
Promise.any( )跟Promise.race( )方法很像,只有一點不同,就是不會因為某個Promise變成rejected狀態而結束。
const promises = [ fetch('/endpoint-a').then(() => 'a'), fetch('/endpoint-b').then(() => 'b'), fetch('/endpoint-c').then(() => 'c'), ]; try { const first = await Promise.any(promises); console.log(first); } catch (error) { console.log(error); }
上邊代碼中,Promise.any( )方法的參數數組包含三個Promise操作,其中只要有一個變成fulfilled,Promise.any( )返回的Promise對象就變成fulfilled.如果所有三個操作都變成rejected,那么await命令就會拋出錯誤。
Promise.any( )拋出的錯誤,不是一個一般的錯誤,而是一個AggregateError 實例。它相當於一個數組,每個成員對應一個被rejected的操作所拋出的錯我。
下面是個AggregateError的實現示例
new AggregateError() extends Array -> AggregateError const err = new AggregateError(); err.push(new Error("first error")); err.push(new Error("second error")); throw err;
捕捉錯誤
var resolved = Promise.resolve(42); var rejected = Promise.reject(-1); var alsoRejected = Promise.reject(Infinity); Promise.any([resolved, rejected, alsoRejected]).then(function (result) { console.log(result); // 42 }); Promise.any([rejected, alsoRejected]).catch(function (results) { console.log(results); // [-1, Infinity] });