这个问题是similar to others,但我遇到的问题更为基本。
这是我的代码:
var links = [];
var casper = require('casper').create();
function getLinks() {
var links = document.querySelectorAll('div#mw-content-text table.wikitable tbody tr td i b a');
return Array.prototype.map.call(links, function(e) {
return 'https://en.wikipedia.org' + e.getAttribute('href');
});
}
casper.start('https://en.wikipedia.org/wiki/David_Bowie_discography');
casper.then(function() {
// aggregate results for the 'casperjs' search
links = this.evaluate(getLinks);
});
casper.each(links, function (self, link) {
self.thenOpen(fullURL, function () {
this.echo(this.getTitle() + " - " + link);
});
});
casper.run();
我知道从Quickstart复制links
时会创建~ $ casperjs casper-google-disco.js
,但我会修改它以打开找到的所有链接。
我得到的是没有任何回声,而是输出我期望的每个标题。这就是我调用文件的方式:
links
答案 0 :(得分:5)
最后解决方案非常简单,但是由于没有任何错误而没有其他人似乎已经找到它,所以我花了很长时间才找到它。
问题是each
变量在调用each
之前没有设置。将then
放在var links = [];
var casper = require('casper').create();
function getLinks() {
var links = document.querySelectorAll('div#mw-content-text table.wikitable tbody tr td i b a');
return Array.prototype.map.call(links, function(e) {
return 'https://en.wikipedia.org' + e.getAttribute('href');
});
}
casper.start('https://en.wikipedia.org/wiki/David_Bowie_discography');
casper.then(function() {
// aggregate results for the 'casperjs' search
links = this.evaluate(getLinks);
casper.each(links, function (self, link) {
self.thenOpen(link, function () {
this.echo(this.getTitle() + " - " + link);
});
});
});
casper.run();
函数中可以解决我的问题。
CasperJS示例中的each.js
example有助于确认您可以在不需要IIFE的情况下循环遍历数组。
{{1}}