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

相关推荐

  1. jsPromise常见用法 比如resolve、race意思

    2024-04-06 06:16:06       14 阅读
  2. ERP、CRM、SRM、PLM、HRM、OA……意思

    2024-04-06 06:16:06       10 阅读
  3. 在编程,方法和函数什么意思

    2024-04-06 06:16:06       14 阅读
  4. hgvs[数字]什么意思

    2024-04-06 06:16:06       19 阅读
  5. 在C语言,%d,%c,%f什么意思

    2024-04-06 06:16:06       128 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-06 06:16:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-06 06:16:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-06 06:16:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-06 06:16:06       20 阅读

热门阅读

  1. Go语言中创建HTTP客户端

    2024-04-06 06:16:06       18 阅读
  2. ChatGPT新手指南:如何应用于学术论文撰写

    2024-04-06 06:16:06       17 阅读
  3. ChatGPT写作指南:制作精彩学术论文的关键

    2024-04-06 06:16:06       14 阅读
  4. 发挥ChatGPT潜能,打造引人注目学术论文

    2024-04-06 06:16:06       12 阅读
  5. LeetCode-热题100:215. 数组中的第K个最大元素

    2024-04-06 06:16:06       14 阅读
  6. golang defer实现

    2024-04-06 06:16:06       13 阅读
  7. 006 CSS常见选择器 CSS伪类 CSS伪元素

    2024-04-06 06:16:06       18 阅读
  8. 《观察者模式(极简c++)》

    2024-04-06 06:16:06       15 阅读
  9. 逻辑回归(Logistic Regression)详解

    2024-04-06 06:16:06       15 阅读