2016-07-17 11 views
1

私はcasperjsを使用しています。私はウェブサイトを使用して値を変更するウェブサイトのコンテンツを取得しようとしています。 これを達成するために、各値にイベントリスナーを追加するのではなく、10秒ごとにウェブサイト全体をクロールしたいだけです。casperjs無限ループタイムアウトが待ちません

私は次のコードを持っている:

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

インサイドgetPricesが、私は値をスクラップすることができるよ、と最後に、私は次の行があります

setTimeout(getPrices(casper),5000); 

を問題があることです私はキャスパーがタイムアウトを無視する理由を知らない。それは単に寝ることなくそれを呼び出すだけです。 一方、私はこれが最大の解決策であるとは考えていません。なぜなら、再帰的で長期的には、メモリスタックで終わるからです。

どうすればいいですか?

ありがとうございます!

答えて

3

すぐにgetPrices(casper)を呼び出してから、その戻り値をsetTimeout()に渡しているため、関数を呼び出す前にタイマーが起動するのを待機しません。

本のあなたの文は:あなたが見ることができるようにそれはすぐに関数を呼び出して、あなたが望むものではありませんどのsetTimeout()にいくつかの戻り値を渡し、

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

setTimeout(getPrices(casper),5000); 

はこのようなものです。それを修正する

いずれかのこれらの1への変更: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()が発生する前にスタックが完全に巻き戻され、スタックが蓄積されません。

+0

うわー!あなたの解決策を試してみましたが、今度はもう一度呼び出されましたが、初めて実行するのを見ています。それは1回、次回は2回印刷します。常に印刷します。他の部分で、あなたが今行ったことを私に説明することができますか?そのバインド(null、casper)は何ですか?ありがとう! –

+0

@gabrielmellace - あなたは '.bind()' [こちらはMDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind)を読むことができます。 – jfriend00

+0

@ gabrielmellace - 私は "配列を2回印刷する"ことを意味しません。あなたの質問には何も関係していません。 – jfriend00

関連する問題