Node.js:当settimeout间隔结束时,期望节点什么都不做,从settimeout连续执行

时间:2014-05-10 13:54:28

标签: node.js settimeout

我正在为节点中的3个当天网站编写通知程序。我去解析网页正文以获取详细信息。在细节中有一个计时器,用于交易将持续多长时间。我正在读取该计时器并尝试使用setTimeout / setInterval来设置何时该函数应该再次执行。但是函数调用是连续的而不是等待。

我正在做的伪代码:

var getData = function(url) {
request(url, function(err, resp, body){                                                                                      
       if(err)   throw err; 
//process the body getting the deal information and timer
setTimeout(getData(url),timer*1000);
}

getData(url1);
getData(url2);
getData(url3);

完整代码here

我希望程序能够运行,不断用网页的新超时自我调用。

我是Node.js的新手,所以我猜测我会因为事物的异步性质而被绊倒。

非常感谢任何帮助。

编辑: 更简单:

var hello = function(){
console.log("hello");
setTimeout(hello(),25000);
}

hello();

每隔2.5秒连续打印你好,而不是打招呼。我做错了什么?

2 个答案:

答案 0 :(得分:2)

问题在hello示例中很明显,所以让我们看一下:

var hello = function(){
    console.log("hello");
    setTimeout(hello(),25000);
}

hello();

特别是这一行:setTimeout(hello(),25000);。也许你期望在25秒超时后拨打hello?好吧,它没有,它立即调用hello,(这是hello()在Javascript中的作用,setTimeout没有什么特别之处),然后它通过了hello()setTimeout的返回值,只有在hello()返回另一个函数时才有意义。由于hello无条件递归地调用自身,因此它不会返回,并且永远不会调用setTimeout。它与执行以下操作类似:

function hello() {
  return doSomething(hello());
}

明确为什么永远不会调用doSomething

如果你想将一个函数传递给setTimeout,只需传递函数本身,不要调用它并传递返回值:setTimeout(hello, 25000);

您的固定代码:

var getData = function(url) {
  request(url, function(err, resp, body){                                                                                      
    if(err)   throw err; 
    //process the body getting the deal information and timer
    setTimeout(getData, timer*1000, url);
  });
};

getData(url1);
getData(url2);
getData(url3);

注意到我将getData的参数作为第三个参数传递给setTimeout

答案 1 :(得分:0)

正在发生的事情是,只要调用getData,就会运行'request'。您希望getData成为您启动计时器的函数,还是加载数据的函数?

var getData = function(url) {
    function doRequest(url) {
        request(url, function(err, resp, body) {                                                                                      
        if(err)   throw err; 
        //process the body getting the deal information and timer
    }
    setTimeout(doRequest(url),timer*1000);
}

getData(url1);
getData(url2);
getData(url3);

你想要的是'setTimeout'指向你在计时器到期后运行的函数(或匿名函数/回调)。正如您最初写的那样,getData会立即调用request(然后在您的计时器后再次调用getData