javascript - 如何在for循环内进行同步延迟?

标签 javascript node.js synchronous

我正在编写一个 NodeJS 脚本,该脚本通过 GET 调用一堆 API(使用来自 npm 的 request)并将响应保存在 JSON 文件中。我正在使用 for 循环遍历 ID 以传递给 API,但我在调用突发之间添加延迟时遇到了麻烦,这样我就不会向 API 服务器发送垃圾邮件并使其生我的气(速率限制)。有谁知道该怎么做吗?

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

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;}
            });
        });
}

我正在寻找这种行为:

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

最佳答案

您可以使用新的 ES6 的 async/await

(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

关于javascript - 如何在for循环内进行同步延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56613559/

相关文章:

javascript - 修复将流体容器网格中的最后一行元素居中,以便在容器保持居中时左对齐

javascript - 具有自定义 eval 函数的 Node.js REPL 有趣行为

node.js - Botframework 在完成当前意图对话框之前不会中断其他意图对话框

javascript - 如何使用 $q Promise 同步执行 FOR LOOP?

Javascript 回调重置转换

javascript - 在 PaperJS 中缩放后重置形状大小的最有效方法是什么

javascript - [Vue.js]vuex 中的命名空间

arrays - Sequelize - 在数组列中查找项目

jquery - 如何从Chrome的window.onunload进行ajax同步调用?

javascript - 避免多次删除事件