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

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

在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)
    });
相关文章
|
JavaScript
JS 获取对象数据类型的键值对的键与值
JS 获取对象数据类型的键值对的键与值
580 0
|
小程序 前端开发
解决小程序 scroll-view 里面的image有间距、小程序里面的图片之间有空隙的问题。
解决小程序 scroll-view 里面的image有间距、小程序里面的图片之间有空隙的问题。
|
1月前
|
人工智能 运维 Java
【SpringAIAlibaba新手村系列】(12)RAG 检索增强生成技术
本文深入探讨 RAG 技术在 AiOps 场景中的应用,以基于 ops.txt 构建运维知识库为例,讲解了如何通过将文本切分、向量化并存入向量数据库,实现 AI 故障查询。内容涵盖 EmbeddingModel、VectorStore 的基本概念,以及利用 Redis 的 SETNX 机制防止知识库重复导入的工程实践。核心在于让 AI 结合外部知识库,更准确地回答运维问题。
413 0
|
7月前
|
前端开发 JavaScript API
js实现promise常用场景使用示例
本文介绍JavaScript中Promise的6种常用场景:异步请求、定时器封装、并行执行、竞速操作、任务队列及与async/await结合使用,通过实用示例展示如何优雅处理异步逻辑,避免回调地狱,提升代码可读性与维护性。
383 10
|
前端开发 JavaScript
如何使用 Promise 处理异步并发操作?
通过使用 `Promise.all()` 和 `Promise.race()` 方法,可以灵活地处理各种异步并发操作,根据不同的业务需求选择合适的方法来提高代码的性能和效率,同时也使异步代码的逻辑更加清晰和易于维护。
|
人工智能 自然语言处理 网络安全
基于阿里云 Milvus + DeepSeek + PAI LangStudio 的低成本高精度 RAG 实战
阿里云向量检索服务Milvus版是一款全托管向量检索引擎,并确保与开源Milvus的完全兼容性,支持无缝迁移。它在开源版本的基础上增强了可扩展性,能提供大规模AI向量数据的相似性检索服务。凭借其开箱即用的特性、灵活的扩展能力和全链路监控告警,Milvus云服务成为多样化AI应用场景的理想选择,包括多模态搜索、检索增强生成(RAG)、搜索推荐、内容风险识别等。您还可以利用开源的Attu工具进行可视化操作,进一步促进应用的快速开发和部署。
1084 1
|
小程序
微信小程序监听页面滚动位置
微信小程序监听页面滚动位置
1157 0
elementui表格自定义表头的两种方法
这篇文章主要是总结了elementui-table表格怎么自定义表头,两种方式需求不一样,大家还有啥好的方法或者遇到的bug评论区留言大家一起解决。
2617 0
|
存储 JSON 安全
深入理解与实践:Token的使用及其在Web应用安全中的重要性
【7月更文挑战第3天】在现代Web应用程序中,Token作为一种关键的安全机制,扮演着维护用户会话安全、验证用户身份的重要角色。本文将深入探讨Token的基本概念、类型、工作原理,并通过实际代码示例展示如何在Web应用中实现Token的生成、验证及应用,以确保数据传输的安全性和用户认证的有效性。
4296 2
|
搜索推荐 算法 大数据
13.经典 O(nlogn) 复杂度算法之快排
13.经典 O(nlogn) 复杂度算法之快排
715 1