js 多个异步 的并发控制
Posted ken丶123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js 多个异步 的并发控制相关的知识,希望对你有一定的参考价值。
今天在群里看到一个人发的面试题:
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 多个异步 的并发控制的主要内容,如果未能解决你的问题,请参考以下文章
全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段
JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段