处理异步函数。自定义回调?

时间:2013-03-30 16:57:46

标签: node.js asynchronous

我有以下代码,并且在 _。每个功能完成后尝试访问 all_records 数组。但是因为它是异步的,我想知道是否有可能强制回调到下划线每个

var request = require('request'),
    cheerio = require('cheerio'),
    _       = require('underscore');

var all_records = [];

_.each([0,100], function(start) {

  var base_url = "http://www.example.com/search?limit=100&q=foobar&start=";
  var url = base_url + start;

  request(url, function(err, res, body) {
    var $ = cheerio.load(body),
      links = $('#results .row');
    $(links).each(function(i, link) {
      var $link = $(link);
      var record = {
        title: $link.children('.title').text().trim()
      };
      all_records.push(record);
    });
  });
});

// Need to run this once _.each has completed final iteration.
console.log(all_records);

2 个答案:

答案 0 :(得分:2)

以下是使用simple synchronization method

的简单解决方案
var count = 101;//there are 101 numbers between 0 and 100 including 0 and 100
_.each([0,100], function(start) {

  var base_url = "http://www.example.com/search?limit=100&q=foobar&start=";
  var url = base_url + start;

  request(url, function(err, res, body) {
    var $ = cheerio.load(body),
      links = $('#results .row');
    $(links).each(function(i, link) {
      var $link = $(link);
      var record = {
        title: $link.children('.title').text().trim()
      };
      all_records.push(record);
      count--;
      if(count===0){//101 iterations done
         console.log(all_records);
      }
    });
  });
});

使用async.parallel方法可以提供更优雅的解决方案。

var requests = []; //an array for all the requests we will be making

for(var i=0;i<=100;i++){
   requests.push((function(done){ //create all the requests
       //here you put the code for a single request. 
       //After the push to all_records you make a single done() call 
       //to let async know the function completed
   }).bind(null,i));//the bind is that so each function gets its own value of i   
}
async.parallel(requests,function(){
    console.log(all_records);
});

答案 1 :(得分:0)

async.each 最终成为最容易实施的。

async.each([0,100], function(start) {
  var base_url = "http://www.example.com/search?limit=100&q=foobar&start=";
  var url = base_url + start;

  request(url, function(err, res, body) {
    var $ = cheerio.load(body),
      links = $('#results .row');
    $(links).each(function(i, link) {
      var $link = $(link);
      var record = {
        title: $link.children('.title').text().trim()
      };
      all_records.push(record);
    });
  });
}, function(err){
  console.log(all_records);
});
相关问题