优化异步操作:追踪Promise.allSettled中独立任务的执行耗时

优化异步操作:追踪Promise.allSettled中独立任务的执行耗时

本文深入探讨如何在javascript中使用promise.allsettled处理并发异步任务时,精确测量每个独立promise的执行时间。通过提供两种实用方法,读者将学习如何记录并获取每个任务从启动到完成的耗时,无论是通过日志输出还是将时间数据嵌入到最终结果中,这对于性能分析、识别瓶颈以及优化用户体验至关重要。

理解Promise.allSettled与性能分析需求

在现代Web开发和Node.js应用中,处理并发异步操作是常见的场景。Promise.allSettled是一个强大的工具,它允许我们等待一组Promise全部完成(无论成功或失败),并返回每个Promise的最终状态和值(或原因)。然而,Promise.allSettled本身并不提供每个独立Promise的执行时间信息。

在某些情况下,了解每个并发任务的具体耗时至关重要。例如,当您同时向多个远程服务发起API请求时,如果其中一些请求耗时过长,可能会影响整体用户体验。通过测量每个请求的独立耗时,您可以识别性能瓶颈,甚至考虑优化策略,例如将快速请求和慢速请求分组处理,以尽早响应部分结果。

本文将介绍两种技术,用于在Promise.allSettled的上下文中,有效地测量和获取每个Promise的执行时间。

方法一:通过日志记录独立Promise的耗时

这种方法通过在每个Promise完成时立即记录其耗时,并将结果输出到控制台。它适用于快速调试和概览每个任务的执行情况,而无需修改Promise.allSettled的最终返回结构。

实现原理

核心思想是利用Promise.prototype.finally()方法。finally()回调函数无论Promise是成功(fulfilled)还是失败(rejected)都会执行,这使得它成为记录完成时间的理想位置。我们可以在finally回调中计算从任务开始到当前时间的时间差。

示例代码

/** * 包装Promise数组,使其在完成时记录各自的执行时间。 * * @param {Array<Promise>} promises 待处理的Promise数组。 * @returns {Promise<PromiseSettledResult[]>} Promise.allSettled的结果。 */function allSettledTimedLog(promises) {    const startTime = Date.now(); // 记录整个批次开始的时间    return Promise.allSettled(promises.map((p, index) => {        return p.finally(() => {            // 在每个Promise完成时,计算并记录其耗时            console.log(`[任务 ${index}] 完成,耗时: ${Date.now() - startTime}ms`);        });    }));}// 模拟异步任务const task1 = new Promise(resolve => setTimeout(() => resolve('Data from Task 1'), 100));const task2 = new Promise(resolve => setTimeout(() => resolve('Data from Task 2'), 300));const task3 = new Promise((resolve, reject) => setTimeout(() => reject(new Error('Task 3 Failed')), 200));console.log("开始执行 Promise.allSettledTimedLog...");allSettledTimedLog([task1, task2, task3]).then(results => {    console.log("所有任务完成,Promise.allSettled 结果:", results);});

代码解析

startTime = Date.now();: 在函数开始时记录一个基准时间。所有任务的耗时都将相对于这个时间点计算。promises.map((p, index) => { … });: 遍历原始的Promise数组。p.finally(() => { … });: 为每个原始Promise添加一个finally回调。当该Promise完成时,无论成功或失败,此回调都会执行。console.log(…);: 在finally回调中,Date.now() – startTime计算出当前Promise从批次开始到完成所经过的时间,并将其打印到控制台。Promise.allSettled(…): 将所有被finally包装过的Promise传递给Promise.allSettled,确保等待所有任务完成。

注意事项: 这种方法记录的是每个Promise相对于整个批次开始时间的完成时间,而不是其纯粹的独立执行时间(从其自身开始到自身结束)。但对于分析并发任务的相对速度和瓶颈识别,这通常已足够。

方法二:将耗时信息嵌入到Promise.allSettled的结果中

如果需要以编程方式访问每个任务的耗时数据,而不仅仅是打印到控制台,可以将时间信息直接集成到Promise.allSettled返回的结果对象中。

实现原理

与方法一类似,我们仍然使用finally()来捕获每个Promise的完成时间。但这次,我们不会立即打印,而是将时间存储在一个外部数组中。一旦Promise.allSettled本身完成,我们再遍历其结果,并将之前存储的时间数据注入到对应的结果对象中。

示例代码

/** * 包装Promise数组,使其在完成时记录各自的执行时间,并将时间嵌入到结果中。 * * @param {Array<Promise>} promises 待处理的Promise数组。 * @returns {Promise<Array<PromiseSettledResult & { time?: number }>>} 包含耗时信息的Promise.allSettled结果。 */function allSettledTimed(promises) {    const startTime = Date.now();    // 用于存储每个Promise的耗时    const taskTimes = new Array(promises.length);    // 1. 包装Promise,并在finally中记录完成时间到taskTimes数组    const wrappedPromises = promises.map((p, index) => {        return p.finally(() => {            taskTimes[index] = Date.now() - startTime;        });    });    // 2. 等待所有包装后的Promise完成,然后处理结果    return Promise.allSettled(wrappedPromises).then(results => {        // 3. 将记录的耗时信息合并到Promise.allSettled的结果对象中        for (let i = 0; i  setTimeout(() => resolve('API 1 Success'), 150));const apiCall2 = new Promise(resolve => setTimeout(() => resolve('API 2 Success'), 400));const apiCall3 = new Promise(resolve => setTimeout(() => resolve('API 3 Success'), 250));const apiCall4 = new Promise((resolve, reject) => setTimeout(() => reject(new Error('API 4 Failed')), 500));console.log("开始执行 Promise.allSettledTimed...");allSettledTimed([apiCall1, apiCall2, apiCall3, apiCall4]).then(resultsWithTime => {    console.log("所有API调用完成,结果(包含耗时信息):");    resultsWithTime.forEach((result, index) => {        console.log(`任务 ${index}: 状态=${result.status}, 耗时=${result.time}ms`);        if (result.status === 'fulfilled') {            console.log(`  值: ${result.value}`);        } else {            console.log(`  原因: ${result.reason.message}`);        }    });});

代码解析

startTime 和 taskTimes: 同样记录批次开始时间,并初始化一个数组taskTimes来存储每个Promise的耗时。promises.map((p, index) => { … });: 为每个原始Promise添加finally回调,但这次,finally不再打印,而是将计算出的耗时赋值给taskTimes[index]。Promise.allSettled(wrappedPromises): 等待所有这些被finally包装过的Promise完成。.then(results => { … });: 当Promise.allSettled返回其标准结果后,我们进入这个then回调。for (let i = 0; i return results;: 返回修改后的结果数组,其中包含了每个任务的耗时信息。

注意事项:

此实现假设传入的是一个可使用.map()方法的数组。如果需要处理任意可迭代对象,则需要稍作修改(例如,先将其转换为数组)。Date.now()提供了毫秒级的时间精度。对于大多数性能分析场景而言,这已足够。如果需要更高精度(例如微秒级),可以考虑使用performance.now()。finally回调确保了无论Promise最终是成功还是失败,我们都能捕获到其完成时间。

总结

通过上述两种方法,您可以在使用Promise.allSettled管理并发异步任务时,有效地追踪和分析每个独立任务的执行耗时。方法一适用于快速日志输出和调试,而方法二则提供了更结构化的数据,便于后续的编程处理和自动化分析。这些技术对于识别系统中的性能瓶颈、优化资源分配以及提升用户体验具有重要的实践意义。

以上就是优化异步操作:追踪Promise.allSettled中独立任务的执行耗时的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1536611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JS数组去重怎么实现_JS数组去重多种方法与性能对比教程
上一篇 2025年12月21日 03:25:55
JS注解怎么和Webpack配合_ Webpack中JS注解的处理与配置技巧
下一篇 2025年12月21日 03:26:08

相关推荐

  • 一把吉他卖出 10 亿后,LiberLive 选择自我革命

    一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命一把吉他卖出 10 亿后,LiberLive 选择自我革命

    如果你是一个社交媒体的高频用户,你很可能已经刷到过不少抱着一把智能吉他弹唱的主播了。 不需要高门槛的学习,无弦吉他给那些不会乐器的人提供了一个机会——用游戏般简单的体验,就能实现抱着吉他弹唱的梦想。自 2023 年 LiberLive 首发初代产品之后,无弦吉他俨然已成为一个新的消费电子赛道。 开创…

    2026年8月25日 用户投稿
    100
  • Java中快速排序的原理 图解快速排序的分治思想实现

    Java中快速排序的原理 图解快速排序的分治思想实现Java中快速排序的原理 图解快速排序的分治思想实现Java中快速排序的原理 图解快速排序的分治思想实现Java中快速排序的原理 图解快速排序的分治思想实现

    快速排序的核心在于分治思想,通过选取基准值将数组分为两个子数组并递归排序。1. 选择基准值(如首元素、随机或三数取中),2. 分区使小于基准值的在左、大于的在右,3. 递归对左右子数组排序。其平均时间复杂度为o(n log n),但最坏情况下可能退化到o(n^2)。相比其他算法,快速排序效率高且空间…

    2026年8月25日 用户投稿
    000
  • 抖店订单怎么同步到抖音小程序?自动共享管理方法详解

    同步抖店订单至抖音小程序,是双平台运营中长期困扰商家的技术痛点。不少商家反映,订单数据分散在不同系统中,导致库存不准、发货延迟等问题频发,大幅提升了运营复杂度。实际上,除了依赖外部工具外,企业还可通过接口开发实现自动化同步。本文将详细介绍可行方案,助力商家打通数据链路,实现订单统一管控。 抖店订单为…

    2026年8月25日
    000
  • 请求限流(Rate Limiting)实现

    限流通过设定请求速率限制来保护系统资源,确保服务稳定性和响应性能。常见算法包括:1. 计数器算法:简单但可能导致突发流量。2. 漏桶算法:稳定但可能积压请求。3. 令牌桶算法:灵活处理突发流量,但实现复杂。 限流(Rate Limiting)是如何在高并发场景下保护系统资源的呢?限流可以防止系统被过…

    2026年8月25日
    000
  • 电脑主板温度多少正常?一文为你解答

    电脑主板温度多少正常?一文为你解答电脑主板温度多少正常?一文为你解答电脑主板温度多少正常?一文为你解答电脑主板温度多少正常?一文为你解答

    一、主板温度多少算正常 通常情况下,主板的正常工作温度会因环境、散热配置及具体型号而异。大致可参考以下范围: 待机状态:30℃~50℃中等使用(如办公、网页浏览、轻度游戏):50℃~70℃高强度运行(如视频渲染、大型游戏):70℃~85℃警戒温度:超过90℃,可能引发系统异常或硬件损伤 若主板长期处…

    2026年8月25日 用户投稿
    100
  • URL加密太长怎么办?StephenHill/Base58帮你缩短URL

    在Web应用开发中,URL的长度一直是一个需要关注的问题。过长的URL不仅难以记忆和分享,还可能在某些系统中受到限制。传统的Base64编码虽然能够将二进制数据转换为文本格式,但其编码后的字符串长度往往较长。这时,Base58编码就派上了用场。Composer在线学习地址:学习地址StephenHi…

    用户投稿 2026年8月25日
    100
  • 怎么运营抖音店铺?最佳运营策略与技巧

    抖音店铺运营全攻略:核心策略与实用技巧 要在抖音平台上实现店铺的持续增长,除了熟悉平台机制和用户习惯外,还需制定科学且高效的运营方案。以下是一套系统化的运营方法,助你全面提升抖音店铺的竞争力。 一、精准搭建与优化店铺 明确商品方向与品牌定位 · 聚焦符合抖音用户偏好的产品类别,突出产品的差异化卖点和…

    2026年8月25日
    000
  • Laravel中的通知(Notifications)系统如何使用?

    在laravel中使用通知系统可以通过以下步骤实现:创建通知类:使用命令php artisan make:notification userregistered生成通知文件,并在其中定义通知逻辑和发送通道。触发通知:在用户模型中添加方法如sendregistrationnotification,并在…

    2026年8月25日
    000
  • 如何通过 MemTest86 进行严格的内存超频稳定性测试?

    使用MemTest86测试超频内存稳定性需先制作启动U盘并设置BIOS从U盘引导,然后运行至少4轮完整测试(建议持续12-24小时),期间观察是否出现错误;若失败则需调整时序、频率或电压后重复验证,确保系统长期可靠。 进行内存超频后,确保系统稳定性至关重要。MemTest86 是目前最权威的内存测试…

    2026年8月25日
    300
  • 电脑鼠标不受控制乱跑咋回事 原因及解决方法

    电脑鼠标不受控制乱跑咋回事 原因及解决方法电脑鼠标不受控制乱跑咋回事 原因及解决方法电脑鼠标不受控制乱跑咋回事 原因及解决方法电脑鼠标不受控制乱跑咋回事 原因及解决方法

    你是否在使用电脑时,发现鼠标指针总是不听使唤,动不动就自己乱飘,甚至像在屏幕上跳舞一样?其实,这种情况并不少见,很多人都曾被这个问题困扰。别着急,下面我们就来逐一排查可能的原因,并提供简单有效的解决方案。 一、桌面或鼠标垫不合适 当鼠标在玻璃、高光或过于光滑的表面上工作时,其底部传感器难以准确捕捉移…

    2026年8月25日 用户投稿
    100
  • 自动化密码查询工具Cypheroth

    Cypheroth介绍 Cypheroth是一款自动化且可扩展的工具套件,旨在帮助研究人员对Bloodhound的Neo4j后端进行自动化密码查询,并将查询结果存储到电子表格中。 Cypheroth是一款Bash脚本,能够自动对Neo4j数据库中存储的Bloodhound数据执行密码查询。 密码查询…

    2026年8月25日
    000
  • 解决Spryker项目中Symfony依赖管理混乱问题,使用spryker/symfony模块实现高效解耦

    可以通过一下地址学习composer:学习地址 当Spryker遇上Symfony:依赖管理的痛点 想象一下,你正在维护一个庞大的Spryker电商平台。随着业务的扩张,项目中的模块(如购物车、订单、用户管理等)如雨后春笋般涌现。这些模块为了实现各自的功能,不可避免地会依赖各种Symfony组件——…

    用户投稿 2026年8月25日
    000
  • java中的runnable关键字用途 Runnable接口的3个实现技巧

    java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧java中的runnable关键字用途 Runnable接口的3个实现技巧

    runnable接口与thread类协同工作的核心机制是:将实现runnable接口的任务对象传递给thread类构造函数,再通过start()方法启动线程。1. runnable接口定义任务逻辑,通过run()方法实现;2. thread类负责执行任务,需将runnable对象传入其构造函数;3.…

    2026年8月25日 用户投稿
    100
  • 剧能剪参加短剧出海产业大会 以智能成片与 AI 翻译高效赋能短剧出海

    2025年7月18日,广州迎来了一场短剧行业的国际盛会——2025短剧出海产业大会。这场聚焦全球市场的行业峰会汇聚了众多头部平台与创新力量,共同探讨内容扬帆海外的新路径。作为推动短剧工业化生产的先锋力量,剧能剪受邀出席,并在圆桌论坛中围绕“ai技术如何重塑短剧出海效率”展开深度分享,其提出的“智能成…

    2026年8月25日
    200
  • 数据库查询优化与索引设计

    我们需要关注数据库查询优化与索引设计,因为它们直接影响应用性能和用户体验。1) 通过优化查询和设计合适的索引,可以显著减少查询时间,提高系统响应速度。2) 索引帮助数据库快速定位数据,但过多索引会增加数据操作开销。3) 使用explain命令分析查询计划,添加适当索引如create index id…

    2026年8月25日
    100
  • 免费PPT生成速度快吗_提升免费PPT生成速度的实用技巧

    使用AI工具、导入文档、预设主题和套用模板可快速制作专业PPT。首先选择迅捷AIPPT等AI平台输入主题生成大纲并应用模板;其次通过Gamma等平台导入Word或文本自动生成幻灯片;再提前设置主题风格以便一键渲染;最后利用Slides%ignore_a_2%等模板库按场景筛选并批量调整格式,全面提升…

    2026年8月25日
    300
  • 抖音加入企业微信有什么用?

    将抖音与企业微信打通,可实现高效引流与深度客户运营。借助抖音的内容曝光能力吸引用户,并将其沉淀至企业微信进行长期维护,有助于提升转化效率和用户忠诚度。本文将深入解析两者联动的核心优势及实际应用方式。 抖音与企业微信协同的价值 精准引流与客户沉淀:通过抖音短视频或直播内容吸引目标受众,在视频中嵌入企业…

    2026年8月25日
    000
  • TCL空调AI主动服务+远程诊断,无惧40℃高温炙烤

    TCL空调AI主动服务+远程诊断,无惧40℃高温炙烤TCL空调AI主动服务+远程诊断,无惧40℃高温炙烤TCL空调AI主动服务+远程诊断,无惧40℃高温炙烤TCL空调AI主动服务+远程诊断,无惧40℃高温炙烤

    今年盛夏,全国多个地区气温突破40℃大关,空调安装与维修需求迎来爆发式增长。行业数据显示,7月空调安装工单量环比显著上升,服务响应效率与质量成为品牌竞争力的核心指标。面对这场高温“大考”,tcl空调以科技创新为驱动力,将「ai主动服务+远程诊断」技术深度融入服务全流程,重塑用户体验边界,并同步推出“…

    2026年8月25日 用户投稿
    000
  • 电脑网络连接图标不见了如何恢复 介绍多种方法

    电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法电脑网络连接图标不见了如何恢复 介绍多种方法

    不少用户会遭遇网络连接图标莫名消失的问题。尽管这看起来只是个小故障,但若未能及时处理,可能会影响日常上网和网络管理。下面将分享几种实用的方法,帮你找回丢失的网络图标。 一、重启Windows资源管理器 有时候,系统资源管理器(Explorer.exe)出现临时异常,会导致任务栏图标不显示。通过重启该…

    2026年8月25日 用户投稿
    200
  • 手动优化小参:tRFC、tFAW 等次级时序调校指南

    tRFC和tFAW调校可提升内存性能与稳定性,tRFC影响刷新延迟,需根据颗粒类型逐步降低并测试;tFAW控制行激活窗口,压缩时需配合tRRD_L优化,并以5为步进调试避免性能下降;两者均需结合tREFI、tRRD_S/L及VDDQ电压协同调整,最终在当前频率电压下找到稳定边界,实现高效稳定运行。 …

    2026年8月25日
    000

发表回复

登录后才能评论
关注微信