Javascript CasperJS中的异步递归处理和事件委托

Javascript CasperJS中的异步递归处理和事件委托,javascript,asynchronous,phantomjs,casperjs,Javascript,Asynchronous,Phantomjs,Casperjs,我正在尝试使用CasperJS运行一个自动化作业,该作业将引入一个JSON文件,并检查每个JSON对象中声明的给定页面上是否存在某些元素。我试图以递归方式编写此代码,但我遇到了一个问题,异步递归流(即我唯一的同步函数)的开始以同步方式返回(如预期的那样),并导致脚本失败 据介绍,PhantomJS目前不支持承诺。我也尝试了.waitFor(),但是如果我尝试从最后一个异步方法中冒泡出true的返回值,这会导致无限循环(还有一个问题,waitFor由超时值控制,不等待响应,但超时值可以更改)。下面

我正在尝试使用CasperJS运行一个自动化作业,该作业将引入一个JSON文件,并检查每个JSON对象中声明的给定页面上是否存在某些元素。我试图以递归方式编写此代码,但我遇到了一个问题,异步递归流(即我唯一的同步函数)的开始以同步方式返回(如预期的那样),并导致脚本失败

据介绍,PhantomJS目前不支持承诺。我也尝试了
.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();
    }
}