2014-11-07 2 views
0

Привет, я делаю веб-скребок с помощью узла, но код всегда возвращает «undefined», я попытался использовать модуль «async», но результат тот же.Возвращаемое значение из асинхронных функций в Nodejs

Где ошибка?

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; 
}; 

Спасибо.

+0

... Вы хотите, чтобы сделать шаг назад и понять общий характер асинхронном программирования, я думаю; уроков много. –

+0

http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call –

ответ

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

Вы не можете вернуть значение при работе с асинхронном (вероятно, вы должны прочитать на как работает async и какие функции обратного вызова).

Чтобы исправить это, вам необходимо предоставить аргумент обратного вызова вашему методу (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` 
}); 
Смежные вопросы