如何在每次迭代中传递变量时循环Horseman实例?

时间:2017-10-25 00:48:07

标签: javascript node.js web-crawler node-horseman

所以我尝试使用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);

仍无济于事,

非常感谢有人能帮助我解决这个问题!

1 个答案:

答案 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);
})