ES11中的Promise.allSettled——并行处理Promise的终结者
2024-02-21 10:44:02
在现代的 JavaScript 开发中,异步编程是不可避免的,而 Promise 对象作为一种处理异步操作的强大工具,被广泛使用。Promise.all 方法可以并行处理多个 Promise,并在所有 Promise 完成后返回一个包含所有结果的数组。然而,Promise.all 有一个缺点,即它会一直等待所有 Promise 完成,而不会提前返回任何结果。
ES11 中引入的 Promise.allSettled 方法解决了这一问题。它允许我们并行处理多个 Promise,并无论这些 Promise 是成功还是失败,都能返回一个包含每个 Promise 的结果或拒绝原因的数组。这使得 Promise.allSettled 在处理并行任务时非常有用,尤其是在某些情况下,我们只需要知道每个 Promise 的状态,而不关心具体的结果或拒绝原因。
以下是一个使用 Promise.allSettled 的示例:
const promises = [
fetch('https://example.com/api/v1/users'),
fetch('https://example.com/api/v1/posts'),
fetch('https://example.com/api/v1/comments')
];
Promise.allSettled(promises).then((results) => {
results.forEach((result) => {
if (result.status === 'fulfilled') {
console.log('Promise fulfilled: ', result.value);
} else {
console.log('Promise rejected: ', result.reason);
}
});
});
在这个示例中,我们使用 Promise.allSettled 并行处理了三个 fetch 请求。无论这些请求成功还是失败,我们都能得到每个请求的结果或拒绝原因。
除了基本用法之外,Promise.allSettled 还支持一些高级用法。例如,我们可以使用它来处理并行任务的超时。我们可以设置一个超时时间,如果在指定时间内某个 Promise 还没有完成,则将其标记为超时。
以下是一个使用 Promise.allSettled 来处理并行任务超时的示例:
const promises = [
fetch('https://example.com/api/v1/users'),
fetch('https://example.com/api/v1/posts'),
fetch('https://example.com/api/v1/comments')
];
const timeout = 5000;
Promise.allSettled(promises, { timeout }).then((results) => {
results.forEach((result) => {
if (result.status === 'fulfilled') {
console.log('Promise fulfilled: ', result.value);
} else if (result.status === 'rejected') {
console.log('Promise rejected: ', result.reason);
} else if (result.status === 'timeout') {
console.log('Promise timed out');
}
});
});
在这个示例中,我们使用 Promise.allSettled 并行处理了三个 fetch 请求,并设置了一个 5 秒的超时时间。如果在 5 秒内某个请求还没有完成,则将其标记为超时。
Promise.allSettled 是 ES11 中引入的一个非常有用的新方法,它可以帮助我们更有效地管理异步操作,提升代码的可读性和可维护性。