在JavaScript中,要在多个异步操作中并行执行某些操作,有多种实现方式,以下是一些常见的方法:
使用Promise.all
Promise.all
方法可以接收一个Promise
数组,当所有Promise
都成功完成时,它返回一个包含所有Promise
结果的数组。如果其中任何一个Promise
被拒绝,Promise.all
将立即返回一个被拒绝的Promise
,并传递第一个被拒绝的Promise
的理由。
const asyncOperation1 = () => new Promise(resolve => setTimeout(() => resolve('结果1'), 1000));
const asyncOperation2 = () => new Promise(resolve => setTimeout(() => resolve('结果2'), 1500));
const asyncOperation3 = () => new Promise(resolve => setTimeout(() => resolve('结果3'), 2000));
async function parallelOperations() {
try {
// 并行执行三个异步操作
const results = await Promise.all([asyncOperation1(), asyncOperation2(), asyncOperation3()]);
console.log('所有异步操作结果:', results);
} catch (error) {
console.error('出现错误:', error);
}
}
parallelOperations();
使用Promise.allSettled
Promise.allSettled
方法也接受一个Promise
数组,它会等到所有Promise
都完成(无论是成功还是失败),然后返回一个包含每个Promise
结果的对象数组,每个对象都有status
属性(fulfilled
或rejected
)和value
或reason
属性,分别表示成功的值或失败的原因。
const asyncOperation1 = () => new Promise(resolve => setTimeout(() => resolve('结果1'), 1000));
const asyncOperation2 = () => new Promise((_, reject) => setTimeout(() => reject('操作2失败'), 1500));
const asyncOperation3 = () => new Promise(resolve => setTimeout(() => resolve('结果3'), 2000));
async function parallelOperations() {
const results = await Promise.allSettled([asyncOperation1(), asyncOperation2(), asyncOperation3()]);
results.forEach(result => {
if (result.status === 'fulfilled') {
console.log('成功:', result.value);
} else {
console.error('失败:', result.reason);
}
});
}
parallelOperations();
使用async
函数和await
在循环中并行
可以在async
函数内部使用for...of
循环或map
方法结合await
来并行执行异步操作。在循环中,每个异步操作都会启动,然后await
会等待所有异步操作都完成。
const asyncOperations = [
() => new Promise(resolve => setTimeout(() => resolve('结果1'), 1000)),
() => new Promise(resolve => setTimeout(() => resolve('结果2'), 1500)),
() => new Promise(resolve => setTimeout(() => resolve('结果3'), 2000))
];
async function parallelOperations() {
try {
const results = await Promise.all(asyncOperations.map(operation => operation()));
console.log('所有异步操作结果:', results);
} catch (error) {
console.error('出现错误:', error);
}
}
parallelOperations();
使用RxJS
库
RxJS
库提供了forkJoin
操作符,它类似于Promise.all
,可以并行执行多个Observable
,并在所有Observable
都发出最后一个值后返回一个包含所有结果的数组。
const {
forkJoin, of } = require('rxjs');
const {
delay } = require('rxjs/operators');
const asyncOperation1 = of('结果1').pipe(delay(1000));
const asyncOperation2 = of('结果2').pipe(delay(1500));
const asyncOperation3 = of('结果3').pipe(delay(2000));
forkJoin([asyncOperation1, asyncOperation2, asyncOperation3])
.subscribe({
next: results => console.log('所有异步操作结果:', results),
error: error => console.error('出现错误:', error)
});