码迷,mamicode.com
首页 > Web开发 > 详细

js 多个异步 的并发控制

时间:2019-03-16 12:49:05      阅读:627      评论:0      收藏:0      [点我收藏+]

标签:保存   code   let   div   har   ==   处理   pre   多个   

 

  今天在群里看到一个人发的面试题:  

1,请实现如下的函数,可以批量请求数据,所有的URL地址在urls参数中,同时可以通过max参数 控制请求的并发度。当所有的请求结束后,需要执行callback回调。发请求的函数可以直接使用fetch。

function sendRequest (urls: string[], max: number, callback: () => void) {

}

 

    fetch 函数返回的是一个promise,promise对象在实例化的时候就已经开始执行了。

 

    

    function sendRequest(urls, max, callback) {
        let allUrls = [...urls],
            i = 0,
            fetchArr = [];
        
        function doFetch() {
            // 处理边界的情况
            if (i === allUrls.length) {
                return Promise.resolve();
            }
            //每次调用出去 一个 url, 放入fetch中
            let one = fetch(allUrls[i++]);
            // 将此promise的状态保存在fetchArr中, 执行完之后 从数组中删除。
            let result = one.then(() => fetchArr.splice(fetchArr.indexOf(result), 1));
            result.push(fetchArr);

            // 数量不够就重复调用doFetch, 够了的话就比较
            let p = Promise.resolve();
            if (fetchArr.length >= max) {
                p = Promise.race(fetchArr);
            }
            return p.then(() => doFetch())
        }
        // 最后用all 处理剩余数组中的,等处理完再执行callback
        return doFetch().then(() => Promise.all(fetchArr)).then(() => {
            callback();
        })
    }

  

  

 

js 多个异步 的并发控制

标签:保存   code   let   div   har   ==   处理   pre   多个   

原文地址:https://www.cnblogs.com/wjyz/p/10541581.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!