怎么在JavaScript中使用承诺控制并发请求个数

  介绍

这篇文章给大家介绍怎么在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中使用承诺控制并发请求个数