1

我正在使用 casperjs,我试图获取使用 websockets 更改其值的网站的内容。为了实现这一点,我不想为每个值添加一个事件侦听器,我只想每 10 秒抓取一次整个网站。

我有以下代码:

casper.waitForResource("http://website.com",function() {
 getPrices(casper);
});

在 getPrices 中,我可以删除这些值,最后我有以下几行:

setTimeout(getPrices(casper),5000);

问题是我不知道为什么 casper 会忽略超时。它只是在不睡觉的情况下调用它。另一方面,我不认为这是最好的解决方案,因为它是递归的,从长远来看,它最终会得到一个内存堆栈。

我怎样才能做到这一点?

谢谢!

4

1 回答 1

3

getPrices(casper)立即调用,然后将该返回值传递给setTimeout(),因此在调用函数之前它不会等待计时器触发。

您对此的声明:

setTimeout(getPrices(casper),5000);

是这样的:

var temp = getPrices(casper);
setTimeout(temp, 5000);

如您所见,它立即调用该函数并传递一些setTimeout()不是您想要的返回值。

要修复它,请更改为以下任一

// pass anonymous stub function
setTimeout(function() {
    getPrices(casper);
},5000);

// use .bind() to create temporary function with the casper parameter bound to it
setTimeout(getPrices.bind(null, casper), 5000);

从 a 重复调用函数setTimeout()实际上并不是递归的。烟囱在setTimeout()火灾前完全展开,因此没有烟囱堆积。

于 2016-07-17T04:48:40.173 回答