JS Promise中的 Promise.all() 与 Promise.allSettled()
在上文中,我们通过一个买饭的例子,介绍了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()。
- 点赞
- 收藏
- 关注作者
评论(0)