casperjs无限循环超时未等待

casperjs infinite loop timeout not waiting

本文关键字:等待 超时 无限循环 casperjs      更新时间:2023-09-26

我使用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()激发之前完全展开,因此没有堆栈堆积。