以 Promise.allSettled 组织异步操作的多线程协奏曲
2023-12-05 04:26:30
主旋律:使用 Promise.allSettled() 并行执行多个异步操作
在多线程编程中,我们经常需要并行执行多个任务,以提高整体效率。在 JavaScript 中,Promise.allSettled() 方法便能实现这一需求。它接受一个 Promise 数组作为参数,并返回一个 Promise,该 Promise 在所有传入的 Promise 都完成时被解析,无论结果是成功还是失败。
Promise.allSettled() 的关键优势在于它始终返回一个 Promise,无论传入的 Promise 是否成功执行。这使得它非常适合处理需要并发执行的任务,例如,同时发送多个网络请求或处理多个文件读取操作。
以下是 Promise.allSettled() 的基本用法:
const promises = [
fetch('https://example.com/api/data'),
fetch('https://example.com/api/data2'),
fetch('https://example.com/api/data3')
];
Promise.allSettled(promises).then(results => {
// 处理所有任务的结果,无论成功与否
results.forEach(result => {
if (result.status === 'fulfilled') {
// 任务成功,获取结果
const data = result.value;
console.log(`Fetched data: ${data}`);
} else {
// 任务失败,获取错误信息
const error = result.reason;
console.error(`Error fetching data: ${error}`);
}
});
});
在这个示例中,我们使用 Promise.allSettled() 来并行执行三个网络请求。无论这些请求成功还是失败,Promise.allSettled() 都会返回一个 Promise,并在所有请求都完成时解析。
变奏曲:Promise.allSettled() 的其他妙用
除了基本用法之外,Promise.allSettled() 还有一些其他的妙用,可以帮助我们处理更复杂的异步任务。
1. 优雅地处理部分任务失败的情况
在某些情况下,我们可能希望并行执行多个任务,但即使其中一个任务失败,也不希望整个过程被中断。这时,Promise.allSettled() 就派上用场了。我们可以使用它来处理部分任务失败的情况,并继续执行其他任务。
const promises = [
fetch('https://example.com/api/data'),
fetch('https://example.com/api/data2'),
fetch('https://example.com/api/data3')
];
Promise.allSettled(promises).then(results => {
// 过滤出成功的任务结果
const successfulResults = results.filter(result => result.status === 'fulfilled');
// 处理成功的任务结果
successfulResults.forEach(result => {
const data = result.value;
console.log(`Fetched data: ${data}`);
});
});
在这个示例中,我们使用 Promise.allSettled() 并行执行三个网络请求。如果其中一个请求失败,Promise.allSettled() 仍然会返回一个 Promise,但这个 Promise 的结果将包含所有任务的结果,无论成功与否。我们可以通过过滤结果数组来获取成功的任务结果,并继续处理这些结果。
2. 测量并行任务的总执行时间
使用 Promise.allSettled(),我们可以轻松地测量并行任务的总执行时间。这是通过使用 Promise.allSettled() 的 race()
方法来实现的。
const startTime = performance.now();
const promises = [
fetch('https://example.com/api/data'),
fetch('https://example.com/api/data2'),
fetch('https://example.com/api/data3')
];
Promise.allSettled(promises).race(() => {
const endTime = performance.now();
console.log(`Total execution time: ${endTime - startTime} ms`);
});
在这个示例中,我们使用 race()
方法来测量并行任务的总执行时间。race()
方法会在所有任务都完成时解析,无论成功与否。一旦 race()
方法解析,我们就计算并记录总执行时间。
尾声:Promise.allSettled() 的力量
总之,Promise.allSettled() 是 JavaScript 中一个非常强大的工具,它可以帮助我们并行执行多个异步操作,并以一致的方式处理所有任务的结果,无论成功与否。通过使用 Promise.allSettled(),我们可以提高应用程序的并发性,并轻松处理复杂的工作流。