2017-03-16 13 views
0

私はJSperファイルを持ち、指定されたページの特定の要素が各JSONオブジェクトで宣言されているかどうかを調べるCasperJSで自動化ジョブを実行しようとしています。私はこれを再帰的に記述しようとしていますが、非同期再帰的フロー(つまり、私の唯一の同期関数)が(期待通りに)同期的に戻り、スクリプトが失敗する問題に取り組んでいます。CasperJSでの非同期再帰処理とイベント委任

this CasperJS github issueによると、約束は現在PhantomJSではサポートされていません。私も.waitFor()CasperJS methodを試しましたが、最終的な非同期メソッドからの返り値trueのバブルアップを試みると、無限ループが発生します(waitForの問題があり、タイムアウト値によって制御され、応答を待たないタイムアウト値は変更できます)。ここでのコード例は、以下のwaitForを使用しようとしてやや簡素化:なぜこれが動作しない

casper.start(urlStart, function() { 
    recursiveRun(jsonInput.length); 
}); 

var recursiveRun = function(count) { 
    if (count) { 
     casper.waitFor(function check() { 
      return controller(); // Infinite loop here 
     }, function then() { 
      jsonInput.shift(); 
      recursiveRun(count - 1); 
     } 
    } 
} 

var controller = function() { 
    casper.thenOpen(jsonInput[0].url, function() { 
     return renavigation(); 
    } 
} 

var renavigation = function() { 
    casper.waitForSelector("#nav", function() { 
     this.thenOpen(inventoryUrl, function() { 
      return inventoryEvaluation(); 
     } 
    } 
} 

var inventoryEvaluation = function() { 
    casper.waitForSelector("#status", function() { 
     this.evaluate(function() { 
      // Unimportant in-browser function 
     } 

     return true; 
    } 
} 

casper.run(); 

?これらのアクションを再帰的かつ非同期的に実行する適切な方法は何ですか?

答えて

0

CasperJS method.eachThen()は、意図したとおりにこの機能を実行しているようです。

.start()メソッドのコールバック内の変数jsonInputでCasperJSを繰り返し実行することで、再帰的に自身を呼び出す同期関数を完全に置き換えることができます。

casper.start(urlStart, function() { 
    this.eachThen(jsonInput, function() { 
     controller(); 
     jsonInput.shift(); 
    } 
} 
関連する問題