我有一个链接数组,以下代码应该打开链接数组中的每个链接。
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 followers
和bmorejs: 503 followers
可以改变吗?
答案 0 :(得分:1)
它似乎在进入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();