http请求的for循环延迟
delay in a for loop for http request
我刚刚开始使用 JS 和 Node.js。我正在尝试构建一个简单的爬虫作为第一个项目,使用 Node.js 和一些模块,例如 request
和 cheerio
。
我想在数组中包含的每个域的每个 http 请求之间添加 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);
});
}
使用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
的延迟被调用,这是 5000 毫秒乘以 i
,所以它会增加每次循环迭代 5 秒。
然后提供将传递给函数的所有参数。
任何寻找华而不实的 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);
});
我刚刚开始使用 JS 和 Node.js。我正在尝试构建一个简单的爬虫作为第一个项目,使用 Node.js 和一些模块,例如 request
和 cheerio
。
我想在数组中包含的每个域的每个 http 请求之间添加 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);
});
}
使用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
的延迟被调用,这是 5000 毫秒乘以 i
,所以它会增加每次循环迭代 5 秒。
然后提供将传递给函数的所有参数。
任何寻找华而不实的 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);
});