如何在多个异步操作中并行执行某些操作?

简介: 如何在多个异步操作中并行执行某些操作?

在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属性(fulfilledrejected)和valuereason属性,分别表示成功的值或失败的原因。

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)
    });
相关文章
|
前端开发
让异步操作同步执行的方法详解
让异步操作同步执行的方法详解
|
10月前
|
Java
使用线程池异步执行
使用线程池异步执行
51 0
同步和异步[多线程的异步执行操作]
同步和异步[多线程的异步执行操作]
79 0
|
C# vr&ar .NET
几种异步操作方式
其实这也是面试中被问倒的问题:(贴在这里纪念一下,注:只是简单的罗列,详细原理及分析,请参阅《CLR Via c#》第三版相关章节) 1、利用线程池发起异步操作 using System; using System.
980 0
|
4月前
|
前端开发 JavaScript
如何使用 Promise 处理异步并发操作?
通过使用 `Promise.all()` 和 `Promise.race()` 方法,可以灵活地处理各种异步并发操作,根据不同的业务需求选择合适的方法来提高代码的性能和效率,同时也使异步代码的逻辑更加清晰和易于维护。
|
调度 网络协议 算法
深入理解并发/并行,阻塞/非阻塞,同步/异步
1. 阻塞,非阻塞 首先,阻塞这个词来自操作系统的线程/进程的状态模型中,如下图: 一个线程/进程经历的5个状态,创建,就绪,运行,阻塞,终止。
1489 0
3 # 通过回调函数处理异步并发问题
3 # 通过回调函数处理异步并发问题
85 0
|
程序员 调度 C#
协程是什么?为何说协程具有同步的编程方式又具有异步的性能?
协程是什么?为何说协程具有同步的编程方式又具有异步的性能?
350 0