题目
实现一个请求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)
网友评论