我正在为节点中的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秒连续打印你好,而不是打招呼。我做错了什么?
答案 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
)