首页 > 其他分享 >关于js,promise并发问题

关于js,promise并发问题

时间:2023-03-15 13:12:44浏览次数:30  
标签:executing js 并发 length let Promise promise result

async function test1 (data, index, limit) {
    let len = data.length
    let result = []
    while (index < len) {
      let res = await fnFunction()
      result = result.concat(res)
      index += limit
    }
    return result
  }

await等待太久,页面卡顿,浏览器卡死

  async function asyncPool (poolLimit, array, iteratorFn) {
    const ret = [] // 用于存放所有的promise实例
    const executing = [] // 用于存放目前正在执行的promise
    for (const item of array) {
      const p = Promise.resolve(iteratorFn(item)) // 防止回调函数返回的不是promise,使用Promise.resolve进行包裹
      ret.push(p)
      if (poolLimit <= array.length) {
        // then回调中,当这个promise状态变为fulfilled后,将其从正在执行的promise列表executing中删除
        const e = p.then(() => executing.splice(executing.indexOf(e), 1))
        executing.push(e)
        if (executing.length >= poolLimit) {
          // 一旦正在执行的promise列表数量等于限制数,就使用Promise.race等待某一个promise状态发生变更,
          // 状态变更后,就会执行上面then的回调,将该promise从executing中删除,
          // 然后再进入到下一次for循环,生成新的promise进行补充
          await Promise.race(executing)
        }
      }
    }
    return Promise.all(ret)
  }

Promise.all太多会卡死

 

  /**
   * arrs 请求数据源数组
   * limit 是每次并行发起多少个请求
   * handleFn 就是异步处理函数
  */
  async function limitQueueFn (arrs, limit, handleFn) {
    // 完成任务数
    let runningIndex = 0 // 这是正在执行的下标
    let finishedIndex = 0 // 这是已经执行完的下表
    let result = new Array(arrs.length).fill(0) // 建立一个空数组, 存储结果
    return new Promise((resolveFn, rejectFn) => {
      // 第一次的时候 一次性执行 limit 个任务
      for (let i = 0; i < limit; i++) {
        run()
      }
      // 执行一个任务
      function run () {
        // 构造待执行任务 当该任务完成后 如果还有待完成的任务 继续执行任务
        new Promise((resolve, reject) => {
          const value = arrs[runningIndex]
          runningIndex++ // 这个是同步操作
          resolve(handleFn(value))
        }).then((res) => {
          result[finishedIndex] = res
          finishedIndex++
          if (runningIndex < arrs.length) {
            run()
          } else { // 全部执行完毕
            resolveFn(result)
          }
        })
      }
    })
  };

栈太深,卡死

  async function finallyFn (data, max) {
    let pool = []
    for (let i = 0; i < queueList.length; i++) {
      let promise = Fn()
      promise.then((res) => {
        console.log(`id${res}的请求已经处理完毕,当前并发为${pool.length}`)
        pool.splice(pool.indexOf(promise), 1)
      })
      pool.push(promise)
      //这里是重点,当满了就阻塞
      if (pool.length == max) {
        await Promise.race(pool)
      }
    }
    return data.length
  }

防止promise.all过多卡死,去除promise.all,采用setinterval等待结果,结束进程,对于项目可用

标签:executing,js,并发,length,let,Promise,promise,result
From: https://www.cnblogs.com/zhangtalent/p/17218110.html

相关文章

  • 一文读懂Js中的this指向
    前言this关键字是一个非常重要的语法点。毫不夸张地说,不理解它的含义,大部分开发任务都无法完成。简单说,this就是属性或方法“当前”所在的对象。this.property上面代......
  • 深入nodejs的event-loop
    此处如无特殊指出的话,eventloop的语境都是指nodejs本文研究所用的nodejs环境是:操作系统window10+nodejs版本号为v12.16.2什么是eventloop?eventloop是指由libuv......
  • 彻底搞懂nodejs事件循环
    nodejs是单线程执行的,同时它又是基于事件驱动的非阻塞IO编程模型。这就使得我们不用等待异步操作结果返回,就可以继续往下执行代码。当异步事件触发之后,就会通知主线程,主线......
  • 银联卡跨行业务地区代码标准,银联卡业务代码标注和行政代码标准对照json
    最近对接一个银行的项目,需要传一个地址,但是该地址id是取自于银行提供的银联卡跨行业务地区代码标准中的id而这个标准中的地区id,和我们库里的不匹配,因为我们库里用的行政......
  • Node.js版的Playwright等待所有请求完成
    以下是一个Node.js版的Playwright等待所有请求完成的Demo喵~:```javascriptconst{chromium}=require('playwright');(async()=>{constbrowser=awaitchr......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(五)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(八)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(七)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(六)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......
  • Cesium 与 Babylon.js 可视化 glsl 特效篇(十二)
    我决定不从Babylonjs基础来讲了直接整合cesium与babylonjs可视化来讲我整合一个类库后续不断更新中npmi@haibalai/cesium-babylonjs 初始化cesium-babylonjs......