JS Promise中的 Promise.all() 与 Promise.allSettled()

举报
搞前端的半夏 发表于 2022/05/31 21:44:48 2022/05/31
【摘要】 在上文中,我们通过一个买饭的例子,介绍了resolve。rejecet和then方法。本文我们继续学习 Promise.all() 与 Promise.allSettled(). Promise.all()它接受一个可迭代的(数组)承诺并返回一个承诺。当所有输入的promise都被解决时,返回的promise将被解决。这个已解决的promise将返回这些已解决的承诺值的数组。让我们看一个例子...

在上文中,我们通过一个买饭的例子,介绍了resolve。rejecet和then方法。本文我们继续学习 Promise.all() 与 Promise.allSettled().

Promise.all()

它接受一个可迭代的(数组)承诺并返回一个承诺。当所有输入的promise都被解决时,返回的promise将被解决。这个已解决的promise将返回这些已解决的承诺值的数组。

让我们看一个例子。

 const promise1 = new Promise(resolve => resolve("promise1"));
 const promise2 = new Promise(resolve => resolve("promise2"));
 const promise3 = new Promise(resolve => resolve("promise3"));
 Promise.all([promise1, promise2, promise3]).then((values) =>
   console.log(values)
 );

这个例子中的所有promise都是解决了的,所以输出的结果是 [‘promise1’,‘promise2’,‘promise3’]

如果存在一个promise没有被解决,那么会返回reject状态的promsie

Promise.all([
         new Promise(resolve => resolve('one')),
         new Promise((resolve,reject) => reject('two')),
         new Promise(resolve => resolve('three'))
])
输出的结果 /Promise {<rejected>: 'two'}

请注意:如果Promise.all() 接受的数组值包含非promise类型,这些值将会被忽略!但是仍然存在于输出结果中。

var p1 = Promise.all([1,2,3]);

var p2 = Promise.all([1,2,3, Promise.resolve(4)]);

var p3 = Promise.all([1,2,3, Promise.reject(5)])

console.log(p1);
console.log(p2);
console.log(p3);
s输出结果
// Promise { <fulfilled>: Array[3] }    // [1,2,3]
// Promise { <fulfilled>: Array[4] }    // [1,2,3,4]
// Promise { <rejected>: 5 }

Promise.allSettled()

它接受一个可迭代(数组)的 promise 并返回一个在所有给定的 promise 都已被resolve或被reject后****解决的 promise ,并带有一个对象数组,每个对象都描述每个 promise 的结果。

结果对象具有:

  • status - 显示承诺的状态
  • value - 表示已履行承诺的价值
const promiseOne = new Promise(resolve => resolve("resolvedOne"));
const promiseTwo = new Promise(resolve => resolve("resolvedTwo"));
Promise.allSettled([promiseOne, promiseTwo]).then((data) =>
  console.log(data)
);

输出结果:
// [{status:'fulfilled',value:"resolvedOne"},{status: "fulfilled",value:"resolvedTwo"}]

如果其中一个承诺被拒绝

const promiseOne = new Promise(resolve => resolve("resolvedOne"));
const promiseTwo = new Promise((resolve, reject) => reject("rejectedTwo"));
Promise.allSettled([promiseOne, promiseTwo]).then((data) =>
  console.log("promise.allSettled", data)
);
//[{status:"fulfilled",value:"resolvedOne"},{status: "rejected",reason:"rejectedTwo"}]

如果一个空的迭代作为参数传递,Promise.allSettled() 返回一个已经被解析数组的 Promise 对象。

Promise.allSettled([]).then(
  (res) => console.log( res) 
);
// []

区别

Promise.all()一旦数组中的一个承诺被拒绝,就会拒绝。返回数组作为包含promise值的输出。

Promise.allSettled()远不会拒绝,无论 iterable 的 Promise 是被解决还是被拒绝,都会被解决。返回对象数组作为输出,其中包含状态和值/原因属性。

什么时候用哪个?

  • 当您想要并行获取数据并且如果它们是依赖的,那么 Promise.all() 是首选。
  • 如果你只想完成所有的promise,不管它们是被解决还是被拒绝,那么使用 Promise.allSettled()。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。