Javascript CasperJS中的异步递归处理和事件委托
我正在尝试使用CasperJS运行一个自动化作业,该作业将引入一个JSON文件,并检查每个JSON对象中声明的给定页面上是否存在某些元素。我试图以递归方式编写此代码,但我遇到了一个问题,异步递归流(即我唯一的同步函数)的开始以同步方式返回(如预期的那样),并导致脚本失败 据介绍,PhantomJS目前不支持承诺。我也尝试了Javascript CasperJS中的异步递归处理和事件委托,javascript,asynchronous,phantomjs,casperjs,Javascript,Asynchronous,Phantomjs,Casperjs,我正在尝试使用CasperJS运行一个自动化作业,该作业将引入一个JSON文件,并检查每个JSON对象中声明的给定页面上是否存在某些元素。我试图以递归方式编写此代码,但我遇到了一个问题,异步递归流(即我唯一的同步函数)的开始以同步方式返回(如预期的那样),并导致脚本失败 据介绍,PhantomJS目前不支持承诺。我也尝试了.waitFor(),但是如果我尝试从最后一个异步方法中冒泡出true的返回值,这会导致无限循环(还有一个问题,waitFor由超时值控制,不等待响应,但超时值可以更改)。下面
.waitFor()
,但是如果我尝试从最后一个异步方法中冒泡出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();
为什么这不起作用?递归和异步执行这些操作(如果有的话)的正确方法是什么?该。eachThen()
似乎可以按预期执行此功能
从上面的示例中,递归调用自身的同步函数可以完全替换为CasperJS在.start()
方法的回调中迭代jsonInput
变量
casper.start(urlStart, function() {
this.eachThen(jsonInput, function() {
controller();
jsonInput.shift();
}
}