我尝试使用CasperJS运行自动作业,该作业引入JSON文件并检查每个JSON对象中声明的给定页面上的某些元素是否存在。我试图递归地写这个,但我遇到的问题是异步递归流的开始(即我唯一的同步函数)同步返回(如预期的那样)并导致脚本失败。
根据this CasperJS github issue,PhantomJS目前不支持Promises。我也尝试了.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 :(得分:0)
CasperJS method .eachThen()
似乎按预期执行此功能。
从上面的例子中,递归调用自身的同步函数可以完全替换为CasperJS在jsonInput
方法的回调中迭代.start()
变量。
casper.start(urlStart, function() {
this.eachThen(jsonInput, function() {
controller();
jsonInput.shift();
}
}