繁体   English   中英

如何使用setTimeout防止429(请求过多)错误

[英]How to prevent 429 (Too Many Requests) error using setTimeout

我正在使用服务用同义词替换文章的单词,该服务的API每分钟限制60个请求。 我有两个函数,第一个函数获取文章并将其拆分为一个Array,然后调用另一个函数替换单词,我试图通过将timeout设置为第二个来做到这一点,因此将首先调用它,然后在60秒后调用它,然后在120秒后...因此,每分钟我最多会致电60次服务。

generateArticle : function(data){ 
  Art.words = data.split(" ");
  for(var j=0; j<Art.words.length/60; j+=1){
    setTimeout(Art.generateSector(j*60),j*60000);
  }
},

generateSector : function(position){
  var count = 0;
  for(var i=position; i<Art.words.length; i+=1){
    if(Art.words[i].length > 3 && isNaN(Art.words[i]) && count < 60){
      Art.findsimilarword(Art.words[i],i);
      count++;
    }
  }
},

但是发生的是第二个函数被立即调用,因此在一篇有400个单词的文章中,前60个单词将被正确替换,而对于其余的340个单词,我将收到错误429 (Too Many Requests) 我是否以错误的方式使用setTimeout? 有人可以向我解释为什么会这样吗?

这段代码:

setTimeout(Art.generateSector(j*60),j*60000);

立即 调用 Art.generateSector ,传入j*60 ,然后获取其返回值并将其传递给setTimeout ,正是foo(bar()) 调用 bar并将其返回值传递给foo

要安排对该函数的调用,请传入一个函数引用。 在您的情况下,您可以使用Function#bind

setTimeout(Art.generateSector.bind(Art, j*60),j*60000);

Function#bind返回一个新的函数,调用它时,会调用原始的给定值作为this (在我们的情况下, Art ),你提供任何额外的参数。


Function#bind是ES5功能。 如果必须支持真正的旧JavaScript引擎(例如IE8中的JavaScript引擎),则可以“填充”(“填充”)此功能。 搜索“函数绑定垫片”或“函数绑定polyfill”以找到多个选项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM