。在Phantom.js中与Cheerio一起玩 - 任何替代方案?

时间:2015-01-02 18:17:49

标签: javascript node.js asynchronous phantomjs cheerio

我正在寻找一些功能,可以让我重复通过PhantomJs(使用类似jQuery的语法)抓取的div元素,但一个接一个 - 不是所有的像.each似乎正在做的同一时间。所以我想我需要同步运行它。

目前我的代码看起来像这样

 page.open("https://www.google.com" + expandedurl, function (status) {
 console.log("opened google knowledge graph ", status);
    page.evaluate(function () { return document.body.innerHTML; }, function (result) {
       var $ = cheerio.load(result);
       $(".kltat").each(function() {
         var link = $(this);
         var text = link.text();
         launch(text);
       });
       ph.exit();
       // Move on to the next one
  });
});

我需要一些不能同时启动所有each次迭代的东西。也许有某种方式可以重复我可以使用的不会异步工作 - 这就是我需要的......

1 个答案:

答案 0 :(得分:0)

如果launch是异步的并且能够进行回调,那么

使用async

var async = require('async');

var $ = cheerio.load(result);
var callbacks = [];
$(".kltat").each(function() {
    var link = $(this);
    var text = link.text();
    callbacks.push(function(cb){
        launch(text, cb);
    });
});

async.series(callbacks, function(){
    ph.exit();
});

否则,您可以使用静态等待数量:

callbacks.push(function(cb){
    launch(text);
    setTimeout(function(){
        cb(null);
    });
});

或使用类似waitFor的内容来等待通过launch触发的外部条件。