所以我尝试使用horseman.js在javascript中编写一个脚本,它将从存储在url数组中的每个链接中提取所有html
基本思路如下,并记录一个url的html就好了
var Horseman = require('node-horseman');
var result = "";
var pulledHtml = "";
var horseman = new Horseman();
horseman
.open(website)
.html()
.then(function(html){
pulledHtml = html;
result += pulledhtml;
return result;
})
.log()
.close();
console.log(results);
当我尝试循环此
时出现问题例如
var result = "";
var pulledHtml = "";
var website = ["www.example1.com","www.example2.com"]; //(etc)
var horseman = new Horseman();
for (var i = 0; i < website.length; i++) {
horseman
.open(website)
.html()
.then(function(html){
pulledHtml = html;
result += pulledhtml;
return result;
})
.log()
.close();
}
console.log(result);
现在我知道这个循环注定要失败问题是我对horseman.js太新了,以便很好地掌握如何从上面的代码中解决这个问题
问题是: 1.)for-loop是同步而不是Horseman是异步的,所以for循环在完成从当前url拉出html之前再次调用horseman
2。)似乎无法确定如何最好地传递html我找到一个新变量,因为我确定我做得不好(最终目标是将所有html保存在一个变量中)< / p>
我到目前为止尝试修复我的第一个问题的方法是
var chain = horseman
for(var i = 1; i < website.length; i++) {
chain = horseman
.open(website)
.html()
.then(function(html){
pulledHtml = html;
result += pulledhtml;
return result;
})
.log()
.close();
}
但是我没有一个很好的方法来测试这个作为console.logging结果后循环没有返回任何东西(我将在以后用结果变量做事)
但是,这似乎等待,因为console.log不会立即返回一个空的结果变量,就像在doomed for循环示例中一样
最后我试过
async.each(website, function(item, callback) {
horseman
.open(website)
.html()
.then(function(html){
pulledHtml = html;
result += pulledhtml;
return result;
})
.log()
.close();
callback();
});
console.log(result);
仍无济于事,
非常感谢有人能帮助我解决这个问题!
答案 0 :(得分:0)
我不知道这个Horseman API,但因为它使用了.then()
函数,我认为它是一个Promise。
尝试这样做,
var result = "";
var website = ["www.example1.com","www.example2.com"]; //(etc)
var promises = [];
website.forEach(url => {
promises.push(new Horseman()
.open(url)
.html())
}
Promise.all(promises)
.then(results => {
return results.forEach(html => {
result += html;
})
})
.then(()=> {
promises.forEach(horse => {
horse.log().close()
})
console.log(result);
})