javascript - 等待所有nodeJS请求完成并给它们添加一个小延迟

标签 javascript node.js node-request

我有一个旨在与远程 API 交互的应用程序。 我必须发出大约 10000 (10k) 个请求,但速度不能太快,否则反 DDoS 保护会阻止我。意味着我需要添加一点延迟。

代码

 var promises = [];
 for(var i = 0 ; i < list.length;i++)
 {
  console.log("checking " + list[i]);
  promises.push(doRequest(token,Username));
 }

 Promise.all(promises).then(function()
 {
  console.log("done");
 },function(err){
  console.log("oops");
 });

doRequest 看起来像这样:

function doRequest(token,username)
{
  var checkUsername = { method: 'GET',
  url: link + username,
  headers: 
   { AUTHORIZATION: 'Bearer ' + token,
     Accept: 'application/json' } };
    return new Promise(function (resolve, reject) 
    {
      request(checkUsername , function (error, res, body) {
        try
        {
          var json = JSON.parse(body);
          if(json.success)
          {
            resolve(username);
          }
          else
          {
            reject(username);
          }
        }
        catch(exception)
        {
          console.log(body);
          reject(exception);
        }
      });
    });
}

似乎每次我到达 JSON.parse(body) 时,它都会崩溃,因为我发送请求的速度太快,远程服务器不会将我视为垃圾邮件机器人,导致我的正文只是未定义,或者只是代码运行太快导致同样的事情。

我怎样才能弥补这种情况,同时仍然保持代码的异步性质,使其仍然相对较快?

最佳答案

答案取决于您想要尝试的速度。允许您同时执行多少个请求等。这是一个可能的策略。您想要考虑这个问题的方法是计算出允许发出多少个并发请求,并将工作分解为所有同时运行的同步块(synchronized block)。

// the number of simultaneous requests that wont cause problems
const allowedSimultaneous = 10

// create each chain
const chains = Array(allowedSimultaneous).fill(Promise.resolve())

// now build a synchronous list for each block
list.forEach((item, i) => {
  const chainIndex = i % allowedSimultaneous
  chains[chainIndex] = chains[chainIndex]
    .then(() => doRequest(token, Username))
})

// finally use .all() to catch when all chains are completed
Promise.all(chains).then(() => console.log('done'))

注意:这是未经测试的代码,但希望您能明白。您想要构建一定数量的并发链,每个链运行一组同步调用。这可确保并发请求数始终allowedSimultaneous

根本不需要延迟,因为只会运行 allowedSimultaneous 调用,但如果您确实需要某种延迟,则可以在每个 doRequest 之后延迟

关于javascript - 等待所有nodeJS请求完成并给它们添加一个小延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439898/

相关文章:

node.js - 无法使用 Node 请求模块在 Linux 上读取 LinkedIn 内容

javascript - 从 keydown 事件监听器中提取去抖函数

javascript - css 和 js 文件的缩小应该在构建步骤中还是手动完成?

node.js - 带有请求的 jasmine-node - 测试重定向的端点不遵循重定向

javascript - Passport 没 react ?

javascript - 如何在没有 Node.js/NPM 的情况下将我的 Web 应用程序转换为 Angular 4

node.js - 使用 Node Request 从 url 下载图像

javascript - 在学校里尝试创造经典的猜数字游戏。我做错了什么?

javascript - 在node.js中寻找process.stdin.on的文档

mysql - 序列化 uuid 的外键给出错误 1215