首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在for循环中创建同步延迟?

如何在for循环中创建同步延迟?
EN

Stack Overflow用户
提问于 2019-06-16 03:27:26
回答 3查看 359关注 0票数 0

我正在编写一个NodeJS脚本,它通过GET (使用来自npm的request )调用大量API,并将响应保存在一个JSON文件中。我使用for循环it来传递给API,但是我在调用突发之间设置延迟有问题,这样我就不会向API服务器发送垃圾邮件,让它对我发火(速率限制)。有人知道怎么做吗?

我当前的代码(没有任何延迟):

代码语言:javascript
复制
var fs       = require('fs');
var request  = require('request');

// run through the IDs
for(var i = 1; i <= 4; i++)
{
    (function(i)
    {
        callAPIs(i); // call our APIs
    })(i);
}

function callAPIs(id)
{
    // call some APIs and store the responses asynchronously, for example:
    request.get("https://example.com/api/?id=" + id, (err, response, body) =>
        {
            if (err)
                {throw err;}

            fs.writeFile("./result/" + id + '/' + id + '_example.json', body, function (err)
            {
                if (err)
                    {throw err;}
            });
        });
}

我正在寻找这样的行为:

代码语言:javascript
复制
callAPIs(1); // start a burst of calls for ID# 1

// wait a bit...

callAPIs(2); // start a burst of calls for ID# 2

// wait a bit...

// etc
EN

回答 3

Stack Overflow用户

发布于 2019-06-16 03:35:51

你可以使用新的es6的async/await

代码语言:javascript
复制
(async () => {
    for(var i = 1; i <= 4; i++)
    {
        console.log(`Calling API(${i})`)
        await callAPIs(i);
        console.log(`Done API(${i})`)
    }
})();

function callAPIs(id)
{
    return new Promise(resolve => {
        // Simulating your network request delay
        setTimeout(() => {
            // Do your network success handler function or other stuff
            return resolve(1)
        }, 2 * 1000)
    });
}

一个有效的演示:https://runkit.com/5d054715c94464001a79259a/5d0547154028940013de9e3c

票数 3
EN

Stack Overflow用户

发布于 2019-06-16 03:35:51

在nodeJS中,你不需要暂停,你可以使用它的异步特性来等待前一个任务的结果,然后再继续下一个任务。

代码语言:javascript
复制
function callAPIs(id) {
  return new Promise((resolve, reject) => {
  // call some APIs and store the responses asynchronously, for example:
    request.get("https://example.com/api/?id=" + id, (err, response, body) => {
      if (err) {
        reject(err);
      }

      fs.writeFile(`./result/${id}/${id}_example.json`, body, err => {
        if (err) {
          reject(err);
        }

        resolve();
      });
    });
  });
}

for (let i = 1; i <= 4; i++) {
  await callAPIs(array[index], index, array);
}

这段代码将执行请求,写入文件,一旦将其写入磁盘,它将处理下一个文件。

在处理下一个任务之前等待固定的时间,如果需要更多的时间怎么办?如果你浪费了3秒钟来确认它已经完成了呢?

票数 3
EN

Stack Overflow用户

发布于 2019-06-16 04:26:21

您可能还想看看异步模块。它由async.times方法组成,该方法将帮助您实现所需的结果。

代码语言:javascript
复制
var fs = require('fs');
var request = require('request');
var async = require('async');


// run through the IDs
async.times(4, (id, next) => {
    // call some APIs and store the responses asynchronously, for example:
    request.get("https://example.com/api/?id=" + id, (err, response, body) => {
        if (err) {
            next(err, null);
        } else {
            fs.writeFile("./result/" + id + '/' + id + '_example.json', body, function (err) {
                if (err) {
                    next(err, null);
                } else
                    next(null, null);
            });
        }
    });
}, (err) => {
    if (err)
        throw err
});

你可以从下面的共享url中读到它:https://caolan.github.io/async/v3/docs.html#times

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56613559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档