我正在使用casperjs,即时尝试获取使用websockets更改其值的网站内容。 为了实现这一点,我只想每10秒抓取整个网站,而不是为每个值添加一个事件监听器。
我有以下代码:
casper.waitForResource("http://website.com",function() {
getPrices(casper);
});
在getPrices中,我可以废弃这些值,最后我有以下几行:
setTimeout(getPrices(casper),5000);
问题是我不知道为什么casper会忽略超时。它只是称它没有睡觉。 另一方面,我不认为这是最好的解决方案,因为它是递归的,从长远来看,它最终会有一个内存堆栈。
我怎样才能做到这一点?
谢谢!
答案 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()
触发之前完全展开,因此没有堆叠堆积。