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

时间:2017-03-16 21:48:45

标签: javascript asynchronous phantomjs casperjs

我尝试使用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();

为什么这不起作用?如果有的话,递归和异步执行这些操作的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

CasperJS method .eachThen()似乎按预期执行此功能。

从上面的例子中,递归调用自身的同步函数可以完全替换为CasperJS在jsonInput方法的回调中迭代.start()变量。

casper.start(urlStart, function() {
    this.eachThen(jsonInput, function() {
        controller();
        jsonInput.shift();
    }
}