zoukankan      html  css  js  c++  java
  • queuedPromise 限制Promise并发数

    /*
     
      思路:1.设置两个数组,一个是当前在执行的数组queue,另一个是存储未来将被执行的Promise的数组defferdQueue
     
               2.为promise设置then方法,在then方法要做:
          如果这个函数执行完毕,从queue中剔除掉这个promise实例
          如果queue满了,向defferedQueue中推入一个函数,函数的执行结果是新建new Promise,并对它then方法处理
     
    */
     
     

     

    源代码:


    let queue = [] // max 3
    let defferdQueue = [] // 延迟执行的数组

    function createQueuedPromise(cons) {
    let p

    function process_queue_and_defferedqueue() {
    for (let i of queue) {
    if (i === p) {
    queue.splice(queue.indexOf(i), 1)
    }
    }
    if (defferdQueue.length) {
    let defferd_p = defferdQueue.shift()
    queue.push(defferd_p())

    // 最后结果
    console.log('..........');
    console.log(queue);
    console.log(defferdQueue);
    }
    }

    // 挂给then的方法
    function process_then(p) {
    p.then(
    // success
    process_queue_and_defferedqueue,
    process_queue_and_defferedqueue
    )
    }

    if (queue.length < 3) {
    p = new Promise(cons)
    process_then(p)
    queue.push(p)
    } else {
    console.log('将被延迟执行!')
    //>=3
    defferdQueue.push(() => {
    p = new Promise(cons)
    process_then(p)
    queue.push(p)
    })
    }
    return p
    }


    let p1 = createQueuedPromise((resolve, reject) => {
    console.log('p1开始执行了');
    setTimeout(() => {
    resolve()
    console.log('p1执行结束了');
    }, 3000)
    })
    console.log(p1);
    let p2 = createQueuedPromise((resolve, reject) => {
    console.log('p2开始执行了');
    })
    console.log(p2);
    let p3 = createQueuedPromise((resolve, reject) => {
    console.log('p3开始执行了');
    })
    console.log(p3);
    let p4 = createQueuedPromise((resolve, reject) => {
    console.log('p4开始执行了');
    resolve()
    })
    console.log(p4);
    let p5 = createQueuedPromise((resolve, reject) => {
    console.log('p5开始执行了');
    })
    console.log(p5);
    let p6 = createQueuedPromise((resolve, reject) => {
    console.log('p6开始执行了');
    })
    console.log(p6);

    补充:

    1. 其实可以直接设置一个running变量来记录当前运行的个数,不需要第一个额外数组了, 2020 0712 

        (1)如果running > num ,那么推入到延迟数组中

        (2)对then进行处理,结果是running-- ,并从延迟数组中拿出一个来执行

  • 相关阅读:
    IntelliJ Idea 常用快捷键 列表(实战终极总结!!!!)
    spring+spring mvc+mybatis 实现主从数据库配置
    Elasticsearch java api 基本搜索部分详解
    Elasticsearch java api 常用查询方法QueryBuilder构造举例
    Elasticsearch JavaApi
    [搜索]ElasticSearch Java Api(一) -添加数据创建索引
    Java Elasticsearch新手入门教程
    转载 Elasticsearch开发环境搭建(EclipseMyEclipse + Maven)
    SpringQuartz 实现定时任务调度
    Mysql语句查询优化
  • 原文地址:https://www.cnblogs.com/eret9616/p/13067711.html
Copyright © 2011-2022 走看看