const results = [];
const timeout = i =>
new Promise(resolve =>
setTimeout(() => {
results.push(i);
resolve();
}, i)
).then(() => {
return i
});
const urls = [100, 500, 300, 200]
function limitRun() {
let index = 0, cnt = 0; // 计数君
let idx = 2; // 通道数
function _request() {
while(idx > 0 && cnt < 3) {
const item = urls[index++] // 取出一个用于请求
idx-- // 占用通道
timeout(item)
.finally(() => { // 注册一个回调函数,做上面提到的两件事
cnt++ // 计数+1
idx++ // 释放通道
if (cnt === 4) {
// 2. 如果发现执行完毕(此处应该有一个计数,统计当前已经请求完毕),那么不再取出数据并且决议完成(或者执行完成后的回调)
// do something..
console.log('执行完毕', results)
} else {
// 1. 如果发现待执行的队列还有需要执行的,把它放入队列(如 `1` 执行完后就应当把 `3` 放入)
_request() // 递归执行
}
})
}
}
_request()
}
limitRun()