我正在阅读 Promise 上的 MDN 手册,发现这两种方法与我相似:
这两个都取一个 iterable 并返回包含已完成的Promise
s的数组。
那么,它们之间有什么区别?
Promise.all
将在数组中的一个拒绝时立即拒绝。
Promise.allSettled
永远不会拒绝-一旦数组中的所有所有承诺被拒绝或解决,它将解决。
它们的解析值也不同。 Promise.all
将解析为Promises解析为的每个值的数组-例如[Promise.resolve(1),Promise.resolve(2)]
将变成[1,2]
。 Promise.allSettled
会给您[{ status : 'fulfilled',value: 1 },{ status : 'fulfilled',value: 2 }]
。
Promise.all([Promise.resolve(1),Promise.resolve(2)])
.then(console.log);
Promise.allSettled([Promise.resolve(1),Promise.resolve(2)])
.then(console.log);
如果其中一个Promises拒绝,则Promise.all
将拒绝并带有拒绝值,但是Promise.allSettled
将在数组中的该位置使用{ status: 'rejected',reason: <error> }
对象进行解析。 / p>
Promise.all([Promise.reject(1),Promise.resolve(2)])
.catch((err) => {
console.log('err',err);
});
Promise.allSettled([Promise.reject(1),Promise.resolve(2)])
.then(console.log);
,
Promise.all::仅当传递给它的 all 承诺(作为数组)解析时,它才会解析,否则它将以 first 拒绝被拒绝的承诺错误。
Promise.allSettled::此问题将始终通过包含有关已解决和被拒绝承诺的信息的数组来得到解决。 仔细查看结果数组的以下属性(状态,值,原因)。
--------------------------------------------------- ----------示例1 -------------------------------------- ---------------------
const pms1 = Promise.resolve(1);
// setTimeout(function,milliseconds,param1,param2,...)
const pms2 = new Promise((resolve,reject) => { setTimeout(resolve,200,2); });
const pms3 = new Promise((resolve,100,3); });
const pmsAry = [pms1,pms2,pms3];
Promise.all(pmsAry)
.then(resAry => console.log(resAry)) // resAry order is same as pmsAry order
.catch(error => console.log(error));
/*
* Note here we are not writing 'catch' because Promise.allSettled ALWAYS RESOLVES
* with array containing information about resolved or rejected promises
*/
Promise.allSettled(pmsAry)
.then(resAry => console.log(resAry)); // resAry order is same as pmsAry order
输出:
[1,2,3]
// Promise.all output ORDER doesn't depend on promise resolution time
[{ status: "fulfilled",{ status: "fulfilled",value: 2 },value: 3 }]
// Promise.allSettled output ORDER doesn't depend on promise resolution time
--------------------------------------------------- ----------示例2 -------------------------------------- ---------------------
const pms1 = Promise.resolve(1);
const pms2 = new Promise(
(resolve,reject) => { setTimeout(reject,'200ms Err'); }
);
const pms3 = new Promise(
(resolve,'100ms Err'); }
);
const pmsAry = [pms1,pms3];
Promise.all(pmsAry)
.then(resAry => console.log(resAry))
.catch(error => console.log(error));
Promise.allSettled(pmsAry)
.then(resAry => console.log(resAry));
输出:
100ms Err
/*
* Note: Here there are TWO promises which are getting REJECTED but output is
* ONLY ONE (i.e the one which is getting rejected FIRST)
*/
[{ status: "fulfilled",// Note: value
{ status: "rejected",reason: "200ms Err" },{ status: "rejected",reason: "100ms Err" }] // Note: reason
,
如果要确保对所使用的操作都应全部解决了诺言/成功,则需要使用rand()
,因为对每个诺言都可以解决它。 >
但是,当您只想完成所有诺言而不论它们是否被兑现时,请使用Promise.all
。
他们两个都执行承诺,但是微妙的区别是他们处理承诺迭代的方式。