一、allSettled兼容
allSettled
是 ES2020 新增的 API,用于将多个 Promise 实例封装成一个 Promise 实例,等到所有的 Promise 实例都返回结果,不管是成功还是失败,包装实例才会结束。但是由于是新增的 API,不同的浏览器、Node.js 系统版本兼容性可能存在差异。以下是代码示例,保证在不同环境下都能正常运行:
const allSettled =
Promise.allSettled ||
function (promises) {
return Promise.all(
promises.map((promise) =>
Promise.resolve(promise).then(
(value) => ({
state: 'fulfilled',
value,
}),
(reason) => ({
state: 'rejected',
reason,
}),
),
),
);
};
二、allsettled怎么读
allSettled
是由 all(全部)和 settled(已解决)两个单词组成的,因此读作“all settled”,意为全部已解决。
三、allSettled翻译
allSettled
的翻译可以是“所有已完成”、“全部已解决”等,都与其含义相近。
四、allSettled返回顺序
allSettled
返回的结果是一个包含所有 Promise 实例的状态和结果的数组,数组的每个元素都是一个对象,其中包含 state
属性(fulfilled
或 rejected
)和对应的 value
或 reason
。
当所有 Promise 实例都成功完成时,返回的数组中所有元素的 state
属性都为 fulfilled
,value
属性对应的是 Promise 实例的结果。
当至少有一个 Promise 实例失败时,返回的数组中所有元素的 state
属性都为 rejected
,reason
属性对应的是 Promise 实例失败的原因。
并且,allSettled
返回的结果的顺序与 Promise 实例数组的顺序一一对应,即第一个 Promise 实例的状态和结果对应返回数组的第一个元素,第二个 Promise 实例对应第二个元素,以此类推。
五、allSettled的应用场景
allSettled
可以用于多个 Promise 实例的并行调用并且对结果统一处理时,比如将多个接口请求封装成 Promise 实例,使用 allSettled
对所有接口返回的数据进行统一处理。
此外,allSettled
还可以用于某些场景下的错误处理。在使用 Promise.all
的情况下,一旦有一个 Promise 实例失败,整个 Promise.all
返回的 Promise 实例就会失败,导致其它 Promise 实例的结果都被忽略。而 allSettled
则不会忽略任何一个 Promise 实例的状态和结果,我们可以根据需要对所有 Promise 实例的状态和结果进行分别处理。
// 将多个接口请求封装成Promise实例
const promise1 = fetch('/api/xxx1');
const promise2 = fetch('/api/xxx2');
const promise3 = fetch('/api/xxx3');
// 使用allSettled对所有接口返回的数据进行统一处理
Promise.allSettled([promise1, promise2, promise3])
.then(results => {
// 遍历所有Promise实例的结果
results.forEach(result => {
// 根据Promise实例的状态和结果进行分别处理
if (result.state === 'fulfilled') {
// 成功处理
console.log(result.value);
} else {
// 失败处理
console.log(result.reason);
}
});
});
六、总结
allSettled
是 ES2020 新增的 API,用于将多个 Promise 实例封装成一个 Promise 实例,等到所有的 Promise 实例都返回结果,不管是成功还是失败,包装实例才会结束。allSettled
返回的结果是一个包含所有 Promise 实例的状态和结果的数组,数组的每个元素都是一个对象,其中包含 state
属性(fulfilled
或 rejected
)和对应的 value
或 reason
。