跳到主要内容

TypeScript 并行执行

介绍

在现代编程中,处理异步任务是非常常见的需求。TypeScript 作为 JavaScript 的超集,提供了强大的工具来处理异步操作。并行执行是一种优化异步任务的方式,它允许多个任务同时运行,从而显著提高程序的效率。

本文将带你深入了解 TypeScript 中的并行执行,包括如何使用 Promise.allPromise.allSettled 等方法来并行处理多个异步任务。我们还将通过实际案例展示如何在实际项目中应用这些概念。

并行执行的基本概念

并行执行是指同时运行多个任务,而不是按顺序逐个执行。在 TypeScript 中,我们通常使用 Promise 来处理异步任务。通过并行执行,我们可以同时启动多个 Promise,并在它们全部完成后继续执行后续操作。

使用 Promise.all 进行并行执行

Promise.all 是一个非常有用的方法,它接受一个 Promise 数组作为参数,并返回一个新的 Promise。这个新的 Promise 在所有输入的 Promise 都成功完成后才会被解析,返回一个包含所有结果的数组。

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

Promise.all([promise1, promise2, promise3])
.then((results) => {
console.log(results); // 输出: [1, 2, 3]
})
.catch((error) => {
console.error(error);
});

在上面的例子中,promise1promise2promise3 是三个并行的 PromisePromise.all 会等待它们全部完成,然后将结果按顺序放入 results 数组中。

备注

如果任何一个 Promise 被拒绝(rejected),Promise.all 会立即返回一个被拒绝的 Promise,并且不会等待其他 Promise 完成。

使用 Promise.allSettled 处理部分失败的情况

Promise.all 不同,Promise.allSettled 会等待所有的 Promise 完成,无论它们是成功还是失败。它返回一个包含每个 Promise 结果的对象数组,每个对象都有一个 status 属性,表示 Promise 的状态(fulfilledrejected)。

const promise1 = Promise.resolve(1);
const promise2 = Promise.reject('Error');
const promise3 = Promise.resolve(3);

Promise.allSettled([promise1, promise2, promise3])
.then((results) => {
console.log(results);
// 输出:
// [
// { status: 'fulfilled', value: 1 },
// { status: 'rejected', reason: 'Error' },
// { status: 'fulfilled', value: 3 }
// ]
});

在这个例子中,即使 promise2 被拒绝,Promise.allSettled 仍然会等待所有 Promise 完成,并返回它们的结果。

实际案例:并行获取多个 API 数据

假设你正在开发一个应用程序,需要从多个 API 获取数据。使用并行执行可以显著减少总的等待时间。

async function fetchData(url: string): Promise<any> {
const response = await fetch(url);
return response.json();
}

async function fetchAllData() {
const urls = [
'https://api.example.com/data1',
'https://api.example.com/data2',
'https://api.example.com/data3'
];

const promises = urls.map(url => fetchData(url));

try {
const results = await Promise.all(promises);
console.log(results);
} catch (error) {
console.error('One of the requests failed:', error);
}
}

fetchAllData();

在这个例子中,我们并行地从三个不同的 API 获取数据。Promise.all 确保所有请求都完成后,我们才处理结果。

总结

并行执行是 TypeScript 中处理异步任务的一种强大工具。通过使用 Promise.allPromise.allSettled,我们可以同时运行多个任务,并在它们全部完成后继续执行后续操作。这不仅提高了程序的效率,还简化了代码的复杂性。

在实际开发中,并行执行可以用于各种场景,如同时获取多个 API 数据、并行处理文件上传等。掌握这些技巧将帮助你编写更高效、更健壮的 TypeScript 代码。

附加资源与练习

  • 练习 1: 尝试修改上面的 fetchAllData 函数,使用 Promise.allSettled 来处理部分失败的请求。
  • 练习 2: 编写一个函数,并行执行多个文件读取操作,并在所有文件读取完成后输出它们的内容。
提示

如果你对 Promise 还不熟悉,建议先学习 Promise 的基本用法,然后再深入了解并行执行。