美文网首页
实现同步控制最大并发数

实现同步控制最大并发数

作者: 看到这朵小fa了么 | 来源:发表于2020-03-24 19:59 被阅读0次
    // /*
    // 执行所有异步任务,但控制最大同时执行的任务数为 3 个
    
    // 假设有一系列返回 Promise 的异步任务 jobs,每个任务所需要的时间都不相同,
    // 所有任务都一定不会失败。
    
    // 请实现一个输入为 jobs 的函数 runParallel,功能是执行 jobs 中的所有异步任务,
    // 但控制最大同时执行的任务数为 3 个。
    
    // runParallel 最终按照 jobs 数组顺序,把每个任务的返回值储存在一个数组里,
    // 并返回这个数组(类似 Promise.all)。
    function limitPromise(list, max) {
        let count = 0
        let taskList = []
        let resultList = Array.from(list).fill(0)
        for (let i = 0; i < list.length; i++) {
            let task = everyPromise(list[i], i)
            if (count < max) {
                task()
            } else { taskList.push(task) }
    
        }
        function everyPromise(item, i) {
            return () => {
                let promise = item()
                promise.then((data) => {
                    count--
                    resultList[i] = data
                    if (taskList.length) {
                        let task = taskList.shift()
                        task()
                    } else if(count==0){
                        console.log(JSON.stringify(resultList))
                    }
                })
                count++
            }
        }
    }
    
    let promise0 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(0)
                resolve(0)
            }, 5000)
        })
    }
    let promise1 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(1)
                resolve(1)
            }, 3000)
        })
    }
    let promise2 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(2)
                resolve(2)
            }, 1000)
        })
    }
    let promise3 = () => {
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(3)
                resolve(3)
            }, 1000)
        })
    }
    let  list= [promise0, promise1,promise2, promise3]
    limitPromise(list, 3)
    // 2,3,1,0
    // [1,2,3,4]
    
    // 用async实现的话会更简单 外部是同步 内部是异步
    async function logInOrder(urls) {
      // 并发读取远程URL
      const textPromises = urls.map(async url => {
        return await url
      });
    
      // 按次序输出
      for (const textPromise of textPromises) {
        await textPromise.then(data => console.log(data));
      }
    }
    

    相关文章

      网友评论

          本文标题:实现同步控制最大并发数

          本文链接:https://www.haomeiwen.com/subject/avuayhtx.html