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