跳到主要内容

TypeScript 并行执行

介绍

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

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

并行执行的基本概念

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

使用 Promise.all 进行并行执行

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

typescript
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)。

typescript
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 获取数据。使用并行执行可以显著减少总的等待时间。

typescript
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 的基本用法,然后再深入了解并行执行。