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