私は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();
?これらのアクションを再帰的かつ非同期的に実行する適切な方法は何ですか?