js中Promise的常见用法 比如resolve、race都是啥意思

在JavaScript中,Promise是一种用于异步编程的构造函数,它提供了更好的处理异步操作的方式,相较于传统的回调函数更易于管理和避免回调地狱。Promise有三种状态:Pending(进行中)、Resolved(已完成)、Rejected(已失败)。

以下是Promise的一些常见用法:

  1. Promise构造函数

    new Promise((resolve, reject) => {// 异步操作if (/* 成功条件 */) {resolve(value); // 当异步操作成功时,调用resolve函数,将Promise的状态变为Resolved,并传递结果值} else if (/* 失败条件 */) {reject(error); // 当异步操作失败时,调用reject函数,将Promise的状态变为Rejected,并传递错误原因}
    });
    
  2. resolve()

    • resolve是Promise构造函数传入的函数之一,当你确定异步操作成功时调用它,使Promise状态变为Resolved,并传递成功的值给后续的.then.catch链中的回调函数。
  3. Promise.race()

    • Promise.race(iterable)方法接受一个Promise对象的可迭代集合(如数组),只要这个集合中的任何一个Promise变为Resolved或Rejected状态,Promise.race就会返回的那个率先改变状态的Promise的结果(无论是Resolved还是Rejected)。
    let p1 = fetch('url1');
    let p2 = fetch('url2');Promise.race([p1, p2]).then(response => {// 第一个fetch请求完成后的响应
    }, error => {// 第一个fetch请求抛出的错误
    });
    
  4. Promise.all()

    • Promise.all(iterable)方法则是等待可迭代集合中的所有Promise全部变为Resolved状态,然后返回一个新的Promise,这个Promise在所有输入的Promise都变为Resolved时才会变为Resolved,并且它的结果是一个数组,包含了所有输入Promise的结果。
    let p1 = fetch('url1');
    let p2 = fetch('url2');Promise.all([p1, p2]).then(responses => {// responses是一个数组,包含了两个fetch请求的结果
    }, error => {// 如果任何一个fetch请求失败了,这里的error将是第一个失败的请求的错误
    });
    
  5. .then() 和 .catch()

    • promise.then(onFulfilled, onRejected)方法用于指定Promise成功或失败后的回调函数,onFulfilled会在Promise被resolve时调用,onRejected会在Promise被reject时调用。
    • promise.catch(onRejected)专门用于处理Promise失败的情况,相当于.then(null, onRejected)

通过这些API,开发人员可以方便地处理异步流程控制,形成更加清晰和易于维护的代码。

async function runParallel(maxConcurrency, source, iteratorFn) {const ret = []const executing = []for (const item of source) {const p = Promise.resolve().then(() => iteratorFn(item, source))ret.push(p)if (maxConcurrency <= source.length) {const e = p.then(() => executing.splice(executing.indexOf(e), 1))executing.push(e)if (executing.length >= maxConcurrency) {await Promise.race(executing)}}}return Promise.all(ret)
}

这是一个实现了并发限制的异步函数,名为runParallel,它接受三个参数:

  1. maxConcurrency:整数,表示允许同时执行的任务的最大数量。
  2. source:可迭代对象,比如数组,其中包含一系列待处理的项。
  3. iteratorFn:一个迭代器函数,它接受两个参数:当前正在处理的项 (item) 和源数组 (source),并返回一个Promise。此函数用于执行针对每一项的操作。

函数的主要逻辑如下:

  • 初始化一个空数组ret用来存放每个任务对应的Promise。
  • 初始化一个空数组executing用来跟踪当前正在执行的任务(即Promise)。

接着遍历source中的每一项:

  • 创建一个Promise(p),在其内部调用iteratorFn函数处理当前项,并立即resolve该Promise。
  • 将Promise p 添加到结果数组ret中。
  • 如果当前已执行的任务数量(executing.length)小于等于最大并发数(maxConcurrency):
    • 当Promise p 完成时,通过.then()方法从executing数组中移除自身。
    • 将Promise p (在其完成回调上添加了删除自身的逻辑)加入到executing数组中。
    • 如果executing数组长度达到了maxConcurrency,就等待数组中任意一个Promise完成(通过Promise.race(executing)实现)。

最后,函数返回Promise.all(ret),这意味着它会等待所有异步任务都完成之后,才返回一个Promise,这个Promise在resolve时会带有所有任务的最终结果组成的数组。

总之,runParallel函数是用来并发执行一系列任务的,同时控制并发任务的数量不超过给定的最大并发数maxConcurrency

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/804974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【深度学习】海洋生物数据集,图片分类

文章目录 任务描述数据收集数据处理模型训练指标评测web app代码和帮助 任务描述 收集9种以上的海洋生物图片&#xff0c;然后基于深度学习做一个分类模型&#xff0c;训练完成后&#xff0c;分类模型就可以对未知图片进行分类。 在之后随便传一张图片&#xff0c;分类模型就…

【静态分析】静态分析笔记01 - Introduction

参考&#xff1a; BV1zE411s77Z [南京大学]-[软件分析]课程学习笔记(一)-introduction_南京大学软件分析笔记-CSDN博客 ------------------------------------------------------------------------------------------------------ 1. program language and static analysis…

ORB-SLAM3整体流程详解

0. 简介 在之前&#xff0c;作者曾经转过一篇《一文详解ORB-SLAM3》的文章。那篇文章中提到了ORB-SLAM3是一个支持视觉、视觉加惯导、混合地图的SLAM系统&#xff0c;可以在单目&#xff0c;双目和RGB-D相机上利用针孔或者鱼眼模型运行。与ORB-SLAM2相比&#xff0c;ORB-SLAM3…

接口自动化框架设计必备利器之参数传递

在我们设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08;如Excel、YAML&#xff09;中&#xff0c;实现测试脚本与测试数据解耦&#xff0c;方便后期维护。 当涉及到业务场景接口用例时&#xff0c;由于接口与接口存在关联关系&#xff…

STL容器之unordered_map类

文章目录 STL容器之unordered_map类1、unordered_map1.1、unordered_map介绍1.2、unordered_map的使用1.2.1、unordered_map的常见构造1.2.2、unordered_map的迭代器1.2.3、unordered_map的容量1.2.4、unordered_map的增删查1.2.5、unordered_map的桶操作 2、unordered_multima…

【快速上手ESP32(基于ESP-IDFVSCode)】04-PWM

PWM PWM&#xff0c;即脉冲宽度调制&#xff08;Pulse Width Modulation&#xff09;&#xff0c;是一种模拟控制方式&#xff0c;根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置&#xff0c;来实现晶体管或MOS管导通时间的改变&#xff0c;从而达到控制开关稳压电源输出…

物联网系统设计 8

1 规划中小型LoRa 中小型分时复用&#xff0c;大型项目需要学习LoRaWAN 1.1 通信记录 1.2 节点能耗 1278芯片 满功率20DMB&#xff0c;增加PA&#xff0c;发送功率 30 DBM 内置天线柔性 棒状 3db 203 休眠、发生、接收 计算链路预算&#xff0c;工作电流&#xff0c;工…

Blocs v5.2.3 mac版 可视化网页设计工具 兼容 M1/M2/M3

Mac毒搜集到的Blocs 是一款mac上专业强大的精美网页设计软件。特点就是简介、高效、高质&#xff0c;可以帮助我们快速设计出精美的网页&#xff0c;retina视网膜特性支持&#xff0c;优化自适应网页的开发。 应用介绍 Blocs 是一款mac上专业强大的精美网页设计软件。专注于简…

实现WAF对CC攻击的零误封防护:关键技术解析与实践

一、引言 Web应用防火墙&#xff08;WAF&#xff09;作为网站安全的重要防线&#xff0c;其在防御CC&#xff08;Challenge Collapsar&#xff0c;即挑战黑洞&#xff0c;一种分布式拒绝服务攻击&#xff09;攻击中的效能至关重要。然而&#xff0c;精准识别并有效拦截CC攻击的…

网络工程师大佬吐血整理!30个网工必学的基础知识点

网络工程师是什么&#xff1f;网络工程师是通过学习和训练&#xff0c;掌握网络技术的理论知识和操作技能的网络技术人员。网络工程师能够从事计算机网络的设计、建设、运行和维护工作。 以下是30个网工必学的基础知识点&#xff0c;还不赶紧收藏&#xff01; 什么是计算机网…

2024阿里云2核4G服务器优惠价格表_2核4G性能测评

阿里云2核4G服务器多少钱一年&#xff1f;2核4G服务器1个月费用多少&#xff1f;2核4G服务器30元3个月、85元一年&#xff0c;轻量应用服务器2核4G4M带宽165元一年&#xff0c;企业用户2核4G5M带宽199元一年。本文阿里云服务器网整理的2核4G参加活动的主机是ECS经济型e实例和u1…

pytesseract,一个超强的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超强的 Python 库 - pytesseract。 Github地址&#xff1a;https://github.com/madmaze/pytesseract 在当今数字化时代&#xff0c;文字识别技术扮演着越来越重要的角色。…

富格林:打击暗箱黑幕正常出金

富格林指出&#xff0c;在进行黄金交易时&#xff0c;对于投资者来说最大的困难莫过于把价格走势看好&#xff0c;却因自己的交易技巧欠缺而落入暗箱黑幕之中从而错失出金的机会。因此&#xff0c;掌握投资的具体技巧对于打击暗箱黑幕是非常关键的。下面富格林将给大家分享一些…

设计模式-装饰者模式(Decorator)

1. 概念 装饰者模式是一种结构型设计模式&#xff0c;它允许用户在不修改原始对象的基础上&#xff0c;通过将对象包装在装饰者类的对象中&#xff0c;动态地给原始对象添加新的行为或职责。 2. 原理结构图 图1 图2 抽象组件&#xff08;Component&#xff09;&#xff1a…

java中Date与LocalDateTime的区别

1、主要有以下区别&#xff1a; Date是Java早期引入的日期和时间类&#xff0c;而LocalDateTime是Java 8中引入的新日期和时间类。Date是可变类&#xff0c;容易引发线程安全问题&#xff0c;而LocalDateTime是不可变类&#xff0c;更加可靠和可维护。Date考虑系统时区&#x…

离散化实现低通滤波器(选用双线性变换)

学习了离散化后整理了其中的核心步骤&#xff0c;此处不对原理进行深究&#xff0c;仅仅介绍如何对一个连续系统进行离散化 此处可以得到低通滤波器的截止频率为1000rad/s. 离散化的过程为将s 2/Ts * [(z - 1) / (z 1)] (选用双线性变换) 得到离散化序列为 Y(z) [w…

Python-VBA函数之旅-bytearray函数

目录 1、bytearray函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、相关文章&#xff1a; 个人主页&#xff1a;非风V非雨-CSDN博客 bytearray函数在Python中提供了一种可变字节序列的表示方式&#xff0c;这在实际编程中有多种应用场景。常见的应用场…

如何用Python编写简单的网络爬虫(页面代码简单分析过程)

一、什么是网络爬虫 在当今信息爆炸的时代&#xff0c;网络上蕴藏着大量宝贵的信息&#xff0c;如何高效地从中获取所需信息成为了一个重要课题。网络爬虫&#xff08;Web crawler&#xff09;作为一种自动化工具&#xff0c;可以帮助我们实现这一目标&#xff0c;用于数据分析…

项目实战 | 使用python分析Excel销售数据(用groupby)

项目实战 | 使用python分析Excel销售数据 本文目录&#xff1a; 零、00时光宝盒 一、提出问题 二、理解数据 2.1、安装python读取excel文件的库 2.2、查看excel表的字段名和前几行记录 2.3、查看excel表结构 2.4、查看索引 2.5、查看每一列的列表头内容 2.6、查看每一…

多线程应用

多线程初始 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms;namespa…