casperjs无限循环超时不等待

casperjs infinite loop timeout not waiting

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

我有以下代码:

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

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

setTimeout(getPrices(casper),5000);

问题是我不知道为什么casper会忽略超时。它只是在不睡觉的情况下调用它。 另一方面,我不认为这是最好的解决方案,因为它是递归的并且在很长的 运行 中,它将以内存堆栈结束。

我怎样才能做到这一点?

谢谢!

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

您对此的陈述:

setTimeout(getPrices(casper),5000);

是这样的:

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

如您所见,它会立即调用该函数并将一些 return 值传递给 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() 触发之前完全展开,因此没有堆栈堆积。