aeX*_*264 31 javascript es6-promise
我正在阅读有关Promise的MDN手册,我发现这两种方法与我相似:
它们都接受一个可迭代对象并返回一个包含已完成的Promises的数组。
那么,它们之间有什么区别呢?
Cer*_*nce 77
Promise.all一旦数组中的 Promise之一拒绝,就会拒绝。
Promise.allSettled永远不会拒绝 - 一旦数组中的所有承诺都被拒绝或解决,它就会解决。
它们的解析值也不同。Promise.all将解析为 Promise 解析为的每个值的数组 - 例如[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);Run Code Online (Sandbox Code Playgroud)
如果其中一个 Promise 拒绝,Promise.all则将使用拒绝的值拒绝,但Promise.allSettled将使用{ status: 'rejected', reason: <error> }数组中那个位置的对象进行解析。
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);Run Code Online (Sandbox Code Playgroud)
当您想确保您正在使用的操作的承诺应该全部得到解决/成功时,您需要使用,Promise.all因为它在每个承诺得到解决时完成。
但是,当您只想完成所有承诺,无论它们是被解决还是被拒绝,那么请使用Promise.allSettled.
它们都批量执行 Promise,但细微的区别在于它们处理 Promise 迭代的方式。
Promise.all:只有当所有传递给它的承诺(作为数组)都解决时,它才会解决,否则它将因第一个被拒绝的承诺错误而拒绝。
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, reject) => { setTimeout(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
Run Code Online (Sandbox Code Playgroud)
输出 :
[1, 2, 3]
// Promise.all output ORDER doesn't depend on promise resolution time
[{ status: "fulfilled", value: 1 },
{ status: "fulfilled", value: 2 },
{ status: "fulfilled", value: 3 }]
// Promise.allSettled output ORDER doesn't depend on promise resolution time
Run Code Online (Sandbox Code Playgroud)
-------------------------------------------------- ------- 示例2 ----------------------------------------- ------------------
const pms1 = Promise.resolve(1);
const pms2 = new Promise(
(resolve, reject) => { setTimeout(reject, 200, '200ms Err'); }
);
const pms3 = new Promise(
(resolve, reject) => { setTimeout(reject, 100, '100ms Err'); }
);
const pmsAry = [pms1, pms2, pms3];
Promise.all(pmsAry)
.then(resAry => console.log(resAry))
.catch(error => console.log(error));
Promise.allSettled(pmsAry)
.then(resAry => console.log(resAry));
Run Code Online (Sandbox Code Playgroud)
输出 :
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", value: 1 }, // Note: value
{ status: "rejected", reason: "200ms Err" },
{ status: "rejected", reason: "100ms Err" }] // Note: reason
Run Code Online (Sandbox Code Playgroud)
Promise.all:当数组中的所有承诺都得到解决时,它会返回一个解决的承诺,如果一个或多个承诺被拒绝,它就会被拒绝。
Promise.allSettled:它返回一个承诺,当数组中的所有承诺都已解决(拒绝或解决)时,该承诺将得到解决。
注意:它们都接受一个可迭代对象并返回一个包含已实现 Promise 的数组。
| 归档时间: |
|
| 查看次数: |
13637 次 |
| 最近记录: |