介绍
这篇文章给大家介绍怎么在JavaScript中使用承诺控制并发请求个数,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
- <李>
串行:一个异步请求完了之后在进行下一个请求
李> <李>并行:多个异步请求同时进行
串行举例:
var p =, function (), { return 才能;new 承诺(function (解决,,拒绝),{ ,,,setTimeout((),=祝辞,{ ,,,,,console.log (“1000”); ,,,,,解决(); ,,,},,1000); ,,}); }; var p1 =, function (), { return 才能;new 承诺(function (解决,,拒绝),{ ,,,setTimeout((),=祝辞,{ ,,,,,console.log (“2000”); ,,,,,解决(); ,,,},,2000); ,,}); }; var p2 =, function (), { return 才能;new 承诺(function (解决,,拒绝),{ ,,,setTimeout((),=祝辞,{ ,,,,,console.log (“3000”); ,,,,,解决(); ,,,},,3000); ,,}); }; (页) ,然后才能((),=祝辞,{ ,,,return p1 (); })才能 ,然后才能((),=祝辞,{ ,,,return p2 (); })才能 ,然后才能((),=祝辞,{ ,,,console.log(“以何种); });才能
如示例,串行会从上到下依次执行对应接口请求。
<强>并行举例:强>
通常,我们在需要保证代码在多个异步处理之后执行,会用到:
Promise.all((承诺:[])),然后((乐趣:函数));
的承诺。所有可以保证,承诺数组中所有承诺对象都达到解决状态,才执行然后回调。
var promises =, function (), { return 才能(1000,,2000,,3000]. map((当前),=祝辞,{ ,,,return new 承诺(function (解决,,拒绝),{ ,,,,,setTimeout((),=祝辞,{ ,,,,,,,console.log(电流); ,,,,,},,电流); ,,,}); ,,}); }; Promise.all(承诺())((),=祝辞,{ console.log才能(“以何种); });
这时候考虑一个场景:
如果你的承诺数组中每个对象都是http请求,而这样的对象有几十万个。
引用>
那么会出现的情况是,你在瞬间发出几十万个http请求,这样很有可能导致堆积了无数调用栈导致内存溢出。
这时候,我们就需要考虑对Promise.all做并发限制。
Promise.all并发限制指的是,每个时刻并发执行数的承诺量是固定的,最终的执行结果还是保持与原来的承诺。所有一致。三、代码实现
整体采用递归调用来实现:最初发送的请求数量上限为允许的最大值,并且这些请求中的每一个都应该在完成时继续递归发送,通过传入的索引来确定了URL里面具体是那个URL,保证最后输出的顺序不会乱,而是依次输出。
代码:
function 多请求(URL,, maxNum), { ,const len =, urls.length;,//,请求总数量 ,const res =, new 数组(len) .fill(0);,//,请求结果数组 ,let sendCount =, 0,,//,已发送的请求数量 ,let finishCount =, 0,,//,已完成的请求数量 ,return new 承诺((解决,,拒绝),=祝辞,{ ,,,,//,首先发送,maxNum 个请求,注意:请求数可能小于,maxNum,所以也要满足条件2 ,,,,//,同步的,创建maxNum个下并行请求,然后才去执行异步的fetch ,所以一上来就有5个下并行执行 ,,,,while (sendCount & lt;, maxNum ,,, sendCount & lt;, len), {, ,,,,,,,,下一个(); ,,,,} ,,,,function next (), { ,,,,,,,,let current =, sendCount + +,,//,当前发送的请求数量,后加一,保存当前请求url的位置 ,,,,,,,,//,递归出口 ,,,,,,,,if (finishCount 祝辞=,len), {, ,,,,,,,,//,如果所有请求完成,则解决掉,承诺,终止递归 ,,,,,,,,,,,,解决(res); ,,,,,,,,,,,,返回; ,,,,,,,,} ,,,,,,,,const url =, url(电流); ,,,,,,,,(url) (result =祝辞,{ ,,,,,,,,,,,,finishCount + +; ,,,,,,,,,,,,res(电流),=,结果; ,,,,,,,,,,,,if (current & lt;, len),{,//如果请求没有发送完,继续发送请求 null null null null null null null null null null null null null null null怎么在JavaScript中使用承诺控制并发请求个数