@kyanny's blog

My thoughts, my life. Views/opinions are my own.

CasperJS の then について

公式 API ドキュメント http://docs.casperjs.org/en/latest/modules/casper.html#then

This method is the standard way to add a new navigation step to the stack, by providing a simple function:

then は「ステップ」を表す。といわれてもなんのこっちゃ、という感じだが、要するに「前の処理が完了するまでちょっと待つ必要がある処理は新しい then のコールバックの中で実行する」という約束なのだ、と考えればよい。

公式 FAQ FAQ — CasperJS 1.1.0-DEV documentation

stackoverflow.com

「ちょっと待つ必要がある」いい例が思いつかなかったけど、例。 Web サイトを訪問してページタイトルを表示する。

casper = require('casper').create()

casper.start()

casper.open 'http://www.apache.org/'
casper.echo "1 -> #{casper.getTitle()}"

casper.open 'http://www.eclipse.org/', ->
  @echo "2 -> #{@getTitle()}"

casper.open 'http://www.fsf.org/' # same to `casper.thenOpen 'http://www.fsf.org/'`
casper.then ->
  @echo "3 -> #{@getTitle()}"

casper.run()

https://github.com/kyanny/playground/blob/gh-pages/how-casperjs-then-works/main.coffee

実行結果。

$ casperjs main.coffee
1 ->
3 -> Front Page — Free Software Foundation — working together for free software

1 は open が完了する前に echo が実行されてしまい、まだページタイトルがとれないので 1 -> だけ表示される。

2 は open そもそもコールバック関数を受け取らないので空振りしている。

3 が正しい使い方で、 open 完了後に実行される次のステップとして then が登録されるのでちゃんとページタイトルが表示される。 thenOpen()open().then() のシンタックスシュガー。