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

2024-04-05 01:44

本文主要是介绍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

这篇关于js中Promise的常见用法 比如resolve、race都是啥意思的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/877354

相关文章

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

Python中的getopt模块用法小结

《Python中的getopt模块用法小结》getopt.getopt()函数是Python中用于解析命令行参数的标准库函数,该函数可以从命令行中提取选项和参数,并对它们进行处理,本文详细介绍了Pyt... 目录getopt模块介绍getopt.getopt函数的介绍getopt模块的常用用法getopt模

mysql中的group by高级用法

《mysql中的groupby高级用法》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,下面给大家介绍mysql中的groupby用法... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

Java中Scanner的用法示例小结

《Java中Scanner的用法示例小结》有时候我们在编写代码的时候可能会使用输入和输出,那Java也有自己的输入和输出,今天我们来探究一下,对JavaScanner用法相关知识感兴趣的朋友一起看看吧... 目录前言一 输出二 输入Scanner的使用多组输入三 综合练习:猜数字游戏猜数字前言有时候我们在

java解析jwt中的payload的用法

《java解析jwt中的payload的用法》:本文主要介绍java解析jwt中的payload的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解析jwt中的payload1. 使用 jjwt 库步骤 1:添加依赖步骤 2:解析 JWT2. 使用 N

Linux命令之firewalld的用法

《Linux命令之firewalld的用法》:本文主要介绍Linux命令之firewalld的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux命令之firewalld1、程序包2、启动firewalld3、配置文件4、firewalld规则定义的九大

SQL BETWEEN 的常见用法小结

《SQLBETWEEN的常见用法小结》BETWEEN操作符是SQL中非常有用的工具,它允许你快速选取某个范围内的值,本文给大家介绍SQLBETWEEN的常见用法,感兴趣的朋友一起看看吧... 在SQL中,BETWEEN是一个操作符,用于选取介于两个值之间的数据。它包含这两个边界值。BETWEEN操作符常用

MySql match against工具详细用法

《MySqlmatchagainst工具详细用法》在MySQL中,MATCH……AGAINST是全文索引(Full-Textindex)的查询语法,它允许你对文本进行高效的全文搜素,支持自然语言搜... 目录一、全文索引的基本概念二、创建全文索引三、自然语言搜索四、布尔搜索五、相关性排序六、全文索引的限制七

python中各种常见文件的读写操作与类型转换详细指南

《python中各种常见文件的读写操作与类型转换详细指南》这篇文章主要为大家详细介绍了python中各种常见文件(txt,xls,csv,sql,二进制文件)的读写操作与类型转换,感兴趣的小伙伴可以跟... 目录1.文件txt读写标准用法1.1写入文件1.2读取文件2. 二进制文件读取3. 大文件读取3.1

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程