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 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

Java 方法重载Overload常见误区及注意事项

《Java方法重载Overload常见误区及注意事项》Java方法重载允许同一类中同名方法通过参数类型、数量、顺序差异实现功能扩展,提升代码灵活性,核心条件为参数列表不同,不涉及返回类型、访问修饰符... 目录Java 方法重载(Overload)详解一、方法重载的核心条件二、构成方法重载的具体情况三、不构

SQL中如何添加数据(常见方法及示例)

《SQL中如何添加数据(常见方法及示例)》SQL全称为StructuredQueryLanguage,是一种用于管理关系数据库的标准编程语言,下面给大家介绍SQL中如何添加数据,感兴趣的朋友一起看看吧... 目录在mysql中,有多种方法可以添加数据。以下是一些常见的方法及其示例。1. 使用INSERT I

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

解读GC日志中的各项指标用法

《解读GC日志中的各项指标用法》:本文主要介绍GC日志中的各项指标用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、基础 GC 日志格式(以 G1 为例)1. Minor GC 日志2. Full GC 日志二、关键指标解析1. GC 类型与触发原因2. 堆

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作