从Nodejs中的异步函数返回值

时间:2014-11-07 16:41:43

标签: javascript node.js

您好我正在使用节点制作网络抓取工具,但代码始终返回'undefined',我尝试使用'async'模块,但结果是一样的。

错误在哪里?

var request = require('request');
var cheerio = require('cheerio');

//this function returns a info of a movie
var get_info = function (url){
  var meta = {
        title   : '',
        year    : '',
        length  : '',
        gen     : '',
        details : '',
        raiting : '',
      };

  request.get(url, function (error, response, html){
    if (!error && response.statusCode == 200){
      var $         = cheerio.load(html);
      meta.title    = $('.movie-title h1').find('a').text();
      meta.year     = $('.release').text();
      meta.length   = $('.running_time').text().replace('minutos', '');
      meta.gen      = $('.btn-tags-list').find('a').first().text();
      meta.details  = $('.description').find('p').text();
      meta.raiting  = $('.movie-rating-average').find('.average').text();
    };
  });
  return meta;
};

感谢。

2 个答案:

答案 0 :(得分:1)

您将使用回调,因为get是异步请求:

var get_info = function (url, callback){
  var meta = {
    title   : '',
    year    : '',
    length  : '',
    gen     : '',
    details : '',
    raiting : '',
  };

request.get(url, function (error, response, html){
  if (!error && response.statusCode == 200){
    var $         = cheerio.load(html);
    meta.title    = $('.movie-title h1').find('a').text();
    meta.year     = $('.release').text();
    meta.length   = $('.running_time').text().replace('minutos', '');
    meta.gen      = $('.btn-tags-list').find('a').first().text();
    meta.details  = $('.description').find('p').text();
    meta.raiting  = $('.movie-rating-average').find('.average').text();
    callback(meta);
  };
});

};

并使用它:

get_info(url, function(meta) {
    console.log(meta);
});

答案 1 :(得分:1)

在处理异步时你不能返回一个值(你应该读一下异步的工作方式和回调函数)。

要解决这个问题,你需要为你的方法(get_info)提供一个回调参数,它基本上会扩展回调链。类似的东西:

var get_info = function(url,callback){
  /* ... */
  request.get(url, function(error, response, html){
    if (!error && response.statusCode == 200){
      // populate `meta`
      callback(meta);
    }
  });
};

您的实施将变为:

get_info('foo', function(meta){
  // you may now work with `meta`
});