美文网首页
用nodejs实现并发请求,每结束一个则发起新的请求

用nodejs实现并发请求,每结束一个则发起新的请求

作者: 前端青音 | 来源:发表于2020-05-15 10:50 被阅读0次

题目

实现一个请求n个url的函数, 并发的请求数不超过设定的throttle, 每结束一个发起新的一个请求, 要求用nodejs实现

代码实现

//  引入nodejs中的EventEmiter 模块
const EventEmiter = require('events');

function req(urls, throttle) {
    let ee = new EventEmiter();
    let ret = [];
    let len = urls.length
    let i = 0;
    // 监听 req 请求
    ee.on('req', function(){
        if(i < len){
            goFetch(urls[i], ret);
        } else if(ret.length === len){
            console.log(ret);
            return ret;
        }
        
    })
    for(let j = throttle; j > 0; j --) {
        goFetch(urls[i], ret)
    }
    
   // 
    function goFetch(url, ret) {
        fetch(url).then(function(data){
            ret.push({url, data})
        }, function(err) {
            ret.push({url, err})
        }).finally(function () {
            // 触发 req 请求
            ee.emit('req');
        })
        i++;
    }
}


// 模拟fetch模块的功能,真正使用时可以直接使用fetch模块即可
function fetch(url){
    return new Promise(function(resolve, reject){
        setTimeout(() => {
            let t = rand(2)
            if(t%2){
                resolve(t)
            } else {
                reject(t)
            }
        }, 100*rand(1))
    })
}

// 伪随机函数
function rand(size = 1) {
    let timetag = [1]
    for(let i = 0; i < size; i++){
        timetag.push(0);
    }
    let times = parseInt(timetag.join(''));
    return parseInt(Math.random()*times);
}

// 调用函数测试
req(['http://www.google.com', 'http://www.bing.com', 'http://alphago.com', 'http://npmjs.org', 'http://github.com', 'http://stackoverflow.com', 'http://taobao.com'], 2)


相关文章

网友评论

      本文标题:用nodejs实现并发请求,每结束一个则发起新的请求

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