Promise实例的any方法
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] });
未完,待续......