Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 用PhantomJS桥序列化函数_Javascript_Node.js_Async.js - Fatal编程技术网

Javascript 用PhantomJS桥序列化函数

Javascript 用PhantomJS桥序列化函数,javascript,node.js,async.js,Javascript,Node.js,Async.js,我有一个链接数组,它使用link parametr作为通过PhantomJS刮取数据的函数。 如何序列化此函数?此for状态一次并行运行3个函数,我收到一个事件错误 在这种情况下,使用是合适的,但是它是如何串联使用的呢?运行函数的时间总是不同的,但是async应该如何理解它已经完成并从新URL开始 var phantom = require('phantom') , async = require('async'); var urls = [ 'http://en.wikipedia.

我有一个链接数组,它使用link parametr作为通过PhantomJS刮取数据的函数。 如何序列化此函数?此for状态一次并行运行3个函数,我收到一个事件错误

在这种情况下,使用是合适的,但是它是如何串联使用的呢?运行函数的时间总是不同的,但是async应该如何理解它已经完成并从新URL开始

var phantom = require('phantom')
  , async = require('async');

var urls = [
  'http://en.wikipedia.org/wiki/Main_Page',
  'http://es.wikipedia.org/wiki/Wikipedia:Portada',
  'http://de.wikipedia.org/wiki/Wikipedia:Hauptseite'
];

async.mapSeries(urls, getTitle, function(err, result){
    console.log(result);
})

function getTitle (link, callback) {
  phantom.create(function(ph) {
    return ph.createPage(function(page) {
      return page.open(link, function(status) {
        return page.evaluate((function() {
          return document.title;
        }), function(result) {
          callback(null, result);
          return ph.exit();
        });
      });
    });
  });
};

我想试试这样的东西:

var links = []
var _ph

function init(cb) {
    phantom.create(function(ph) {
        //for each link in links call doStuff()
        _ph = ph 
        doStuff(ph, link, cb)   
    })   
}

function doStuff(ph, link, cb) {
    ph.createPage(function(page) { //does things in parallel?
      page.open(link, function(status) {
        page.evaluate((function() {
          document.title;
        }), function(result) {
          cb(null, result);
          page.close();
        });
    });
}

var counter = links.length
var titles;

function results(err, res) {
  titles.push(res)

  if(--counter == 0) {
    //done
    _ph.exit()
  }
 }

init(results)
var links = []
var _ph
var _page

function init(cb) {
    phantom.create(function(ph) {

        _ph = ph 
        ph.createPage(function(page) {
             _page = page
             doStuff(link, cb)
        }   
    })   
}

function doStuff(page, link, cb) {
      page.open(link, function(status) {
        page.evaluate((function() {
          document.title;
        }), function(result) {
          cb(null, result);
          page.close();
        });
    });
}

 var counter = links.length
var titles;

function results(err, res) {
  titles.push(res)

  if(--counter == 0) {
    //done
    _ph.exit()
    return
  }

  doStuff(links[counter], results)
 }

init(results)
可能代码不起作用(我在这里写的),但我希望您能理解。如果只想使用1页,请执行以下操作:

var links = []
var _ph

function init(cb) {
    phantom.create(function(ph) {
        //for each link in links call doStuff()
        _ph = ph 
        doStuff(ph, link, cb)   
    })   
}

function doStuff(ph, link, cb) {
    ph.createPage(function(page) { //does things in parallel?
      page.open(link, function(status) {
        page.evaluate((function() {
          document.title;
        }), function(result) {
          cb(null, result);
          page.close();
        });
    });
}

var counter = links.length
var titles;

function results(err, res) {
  titles.push(res)

  if(--counter == 0) {
    //done
    _ph.exit()
  }
 }

init(results)
var links = []
var _ph
var _page

function init(cb) {
    phantom.create(function(ph) {

        _ph = ph 
        ph.createPage(function(page) {
             _page = page
             doStuff(link, cb)
        }   
    })   
}

function doStuff(page, link, cb) {
      page.open(link, function(status) {
        page.evaluate((function() {
          document.title;
        }), function(result) {
          cb(null, result);
          page.close();
        });
    });
}

 var counter = links.length
var titles;

function results(err, res) {
  titles.push(res)

  if(--counter == 0) {
    //done
    _ph.exit()
    return
  }

  doStuff(links[counter], results)
 }

init(results)

如果
返回结果,则
scrapedData
函数看起来不是很异步……为什么需要串联运行刮片?您可以轻松地将它们并行化。@Bergi我添加了一个回调,请检查它们是否在正确的位置,因为它仍然不起作用。
scrapedData.bind(crapedData)
?这样就可以通过
crapedData
函数了only@khaljava尝试创建一个phantomjs实例,然后打开许多页面。而不是
ph.exit()
do
page.close()
并仅在所有页面调用回调时退出。好主意,但您确实应该在
async
库已经可用时使用它:-)@fusio感谢您的回答,但感谢您创建了“\u ph”变量