0

我有一个链接数组,下面的代码应该打开链接数组中的每个链接。

var x; var i = 0;

casper.start(URL, function() {
    x = links.split(" "); // now x is an array of links
});

casper.then(function() {
    this.each(x, function() { 
        this.thenOpen((partialURL + x[i]), function() {
            this.echo(this.getTitle()); // display the title of page
            i++; // change the link being opened
        });
    });
});

casper.run();

问题是它打开了第一个链接,只是一遍又一遍地打开那个链接。好像i没变

其中一个 CasperJS 示例存在同样的问题,对于 Twitter 关注者,它会为每个 Twitter 关注者打开链接,但它会始终显示一个名称(列表中的最后一个)。

这是示例:

var users = ['subelsky','bmorejs'];
var casper = require('casper').create();

var idx,data,user;
var length = users.length;

casper.start();

for (idx=0; idx < length; idx++) {
    user = users[idx];

    casper.thenOpen('http://mobile.twitter.com/' + user,function() {
        data = this.evaluate(function(location) {
            return document.querySelector('div.profile td.stat.stat-last div.statnum').innerText;
        });
        this.echo(user + ": " + data);
    });
}

casper.run();

输出将是bmorejs: 2861 followersbmorejs: 503 followers

这可以改变吗?

4

1 回答 1

1

似乎它在进入 for 函数之前会遍历所有链接thenOpen,而只是打开链接。这是一个简单的修复。

只需将您的i++;声明移到thenOpen方法上方,这样在打开新链接之前它肯定会发生变化。另外,将 的初始值更改为i-1使其在运行i++;时不会1立即跳到 。

您的代码将更改为以下内容:

var x; var i = -1;          

casper.start(URL, function() {
    x = links.split(" "); // now x is an array of links
});

casper.then(function() {
    this.each(x, function() { 
        i++; // change the link being opened (has to be here specifically)
        this.thenOpen((partialURL + x[i]), function() {
            this.echo(this.getTitle()); // title should now be different
        });
    });
});

casper.run();
于 2013-07-31T13:16:16.137 回答