在使用CasperJS迭代参数化URL时,只执行最后一次迭代

时间:2014-12-27 22:37:31

标签: javascript callback casperjs

我有这段代码:

var casper = require('casper').create();
var startID = 21;
var endID = 13533;
while (startID <= endID) {
    scrapPages(startID);
    startID++;
}

function scrapPages(i) {
    var str = "Starting to get the HTML for the problem" + i;
    console.log(str);

    var url = 'http://community.topcoder.com/stat?c=problem_statement&pm=' + i;
    casper.start(url, function() {
        this.echo(startID);
        var result = this.getHTML('td.problemText');
        casper.then(function() {
            var fileName = 'problem' + i + ".html";
            require('fs').write(fileName, result, 'w');
            this.echo("writing it to filename:  " + fileName)
        });
    });
}

casper.run();

我所做的就是尝试解析Topcoder的所有问题。我相信这个问题不是关于Javascript Closures问题的重复。

问题是,函数scrapPages只运行一次,即while循环的最后一次迭代。

有人可以帮我解释为什么会这样吗?

1 个答案:

答案 0 :(得分:1)

您有很多start个,但只有一个run。两者都应该使用一次。您可以在循环开始前调用start而不参数,然后将casper.start内的scrapPages更改为casper.thenOpen

您可以进入code进行验证。调用start时,所有先前安排的步骤都将丢失。