Im using casperjs, im trying to get the content of a website that changes its values using websockets. To accomplish this, instead of adding an event listener to each value, I just want to crawl the whole website every 10 seconds.
I have the following code:
casper.waitForResource("http://website.com",function() {
getPrices(casper);
});
Inside getPrices, I'm able to scrap the values, and at the end i have the following lines:
setTimeout(getPrices(casper),5000);
The problem is that I dont know why casper ignores the timeout. It just calls it without sleeping. On the other hand, I dont think that this is the greatest solution, since its recursive and in the long run, it will end up with a memory stack.
How can i accomplish this?
Thanks!
You are calling getPrices(casper)
immediately and then passing that return value to setTimeout()
, thus it doesn't wait for the timer to fire before calling the function.
Your statement of this:
setTimeout(getPrices(casper),5000);
is like this:
var temp = getPrices(casper);
setTimeout(temp, 5000);
As you can see, that calls the function immediately and passes some return value to setTimeout()
which is not what you want.
To fix it, change to either one of these:
// 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);
Calling a function repeatedly from a setTimeout()
is not actually recursive. The stack completely unwinds before the setTimeout()
fires so there is no stack build up.