casperjs无限循环超时不等待

时间:2016-07-17 04:46:47

标签: javascript phantomjs casperjs slimerjs

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

我有以下代码:

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

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

setTimeout(getPrices(casper),5000);

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

我怎样才能做到这一点?

谢谢!

1 个答案:

答案 0 :(得分: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);

setTimeout()重复调用函数实际上并不是递归的。堆栈在setTimeout()触发之前完全展开,因此没有堆叠堆积。