【问题标题】:NodeJS : Waiting 5 seconds between URL requests is not workingNodeJS:在 URL 请求之间等待 5 秒不起作用
【发布时间】:2014-09-15 15:05:32
【问题描述】:

我正在尝试抓取我网站上的 URL 列表。我想在 URL 请求之间等待五秒钟,但问题是无论我如何将 setTImeout 函数埋入脚本中,它都不会按照我想要的方式等待。

var urlArray=["http://domain.com/page1.php", "http://domain.com/page2.php", ... ];
var request = require('request');
function logStatus(url){ 
    request(url, function (err, res, body){
        console.log(res.statusCode); 
    });
    return 1;
} 
function doSetTimeout(getURL){
    timer = setTimeout(logStatus(getURL), 5000);
    clearTimeout(timer);
}
urlArray.forEach(function(entry) {
    doSetTimeout(entry); 
    //setTimeout(logStatus(entry), 5000)
}); 

工作编辑:

var request = require('request');
function logStatus(url){ 
    return 1;
} 
var waitInSeconds=5;
var waitInMilliSeconds=waitInSeconds*1000; 
console.log('This scan will take '+((urlArray.length * waitInSeconds)/60)+' minutes');
for(i=0; i<=1000;i++){ 
    if(!urlArray[i]) { //if url number i is not in array
        break;
    };
    (function(i){
        setTimeout(function(){
            request(urlArray[i], function (err, res, body){
                console.log(res.statusCode);
                if(i/10 % 1 === 0 ){ //if we have completed 10 more requests, let the user no how much time is remaining.
                    console.log(((urlArray.length * waitInSeconds)/60)+' minutes remaining.');
                } 
            }); 
        }, waitInMilliSeconds * i);
    }(i));
}

【问题讨论】:

  • 这个构造setTimeout(logStatus(getURL), 5000); 立即调用logStatus(getURL)。它不会等待超时。您需要将函数引用传递给setTimeout(),以便稍后调用。 fn() 立即被调用。 fn 是一个函数引用,以后可以调用。

标签: node.js request settimeout


【解决方案1】:

试试这个:

var urlArray=["http://domain.com/page1.php", "http://domain.com/page2.php", ... ];
var request = require('request');

function processUrls(urls) {
  var url = urls.shift();
  logStatus(url, function() {
    if(urls.length > 0) {
        setTimeout(processUrls.bind(this, urls));
    }
  });
}

function logStatus(url, done){ 
  request(url, function (err, res, body){
    console.log(res.statusCode); 
    done();
  });
} 

processUrls(urlArray);

【讨论】:

  • 感谢蒂莫西,自从发布此内容后,我实际上已经找到了一个替代解决方案。虽然你的更干净并且可以工作,但这个项目并不足以改变我的工作解决方案以获得更清洁的解决方案。感谢您花时间回答我的问题。
  • 最佳答案包含对原始问题中的问题的描述,以及您在答案中所做的更改以及解决问题的原因。像这样的答案让读者试图弄清楚你改变了什么,以及为什么哪些没有像它可能的那样提供信息或有用。
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 2017-07-30
  • 2017-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 2021-10-07
相关资源
最近更新 更多