在for循环中延迟http请求

5

我刚刚开始学习JS和Node.js。我的第一个项目是使用Node.js和一些模块(如requestcheerio)构建一个简单的爬虫。

我想在包含在数组中的每个域名之间添加5秒的延迟。你能告诉我如何做吗?

这是我的代码:

var request = require('request');

var arr = [ "http://allrecipes.com/", "http://www.gossip.fr/" ];

for(var i=0; i < arr.length; i++) {
    request(arr[i], function (error, response, body){
        console.log('error:', error);
        console.log('statusCode:', response && response.statusCode);
        console.log('body:', body);
    });
}
2个回答

10
任何想要一个华丽的ES6+ Promises和Async/Await答案的人都可以使用这个。
我们在这里使用的是request-native-promises
const rp = require("request-promise-native");
const productID = [0,1,2,3,4,5,6]

//here we make our timeout synchronous using Promises
function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

//run your code in an async block
async function demo() {
  for (let i = 0; i < productID.length; i++) {
    const options = {
      method: "GET",
      url: `https://link_to_your_api/productID[i]`,
      json: true,
    };
    const body = await rp(options);
    console.log(`Awaiting 1s ...`);
    //waiting before sleep function executes using it synchronously
    await sleep(1000);
  }
}
demo();

//since I haven't done any error handling
process.on("unhandledRejection", err => {
  console.log("Unhandled rejection:", err.message);
});

4
使用 setTimeout
var request = require('request');
var arr = ["http://allrecipes.com/", "http://www.gossip.fr/" ];

for (var i = 0; i < arr.length; i++) {
    setTimeout(request, 5000 * i, arr[i], function (error, response, body){
        console.log('error:', error);
        console.log('statusCode:', response && response.statusCode);
        console.log('body:', body);
    });
}

你基本上需要创建一个循环,并设置request方法的延迟时间为5000 * i,其中i是循环次数乘以5000毫秒,因此每次循环迭代都会增加5秒。 然后,你需要提供将传递给函数的所有参数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接