2015-01-06 4 views
1

Мне нужно получить заголовок HTML-страницы, и я использую node-metainspector.Ожидание асинхронного вызова

Я создал модуль:

var MetaInspector = require('node-metainspector'); 

exports.getTitle = function(url) { 
    var fullUrl = "http://" + url; 
    var inspector = new MetaInspector(fullUrl, {}); 
    var title = ''; 

    inspector.on('fetch', function() { 
    title = inspector.title; 
    console.log(title); 
    return title; 
    }); 

    inspector.on('error', function(error) { 
    console.log(error); 
    }); 

    inspector.fetch(); 
} 

И использовать его в своем экспресс-приложения:

exports.add = function(req, res) { 
    var url = req.body.url; 
    console.log(url); 
    console.log(parser.getTitle(url)); 
} 

Этот код не работает правильно. Линия console.log(parser.getTitle(url)); возвращает undefined. Я думаю, что причина такой асинхронной природы JS. inspector.on('fetch') вызывается после завершения getTitle(). Но я новичок в node.js, и я не знаю, каков хороший шаблон для решения этой проблемы.

ответ

2

Вы должны преобразовать getTitle в асинхронной функции, добавив параметр обратного вызова:

exports.getTitle = function(url, cb) { 

    // ... 

    inspector.on('fetch', function() { 
    title = inspector.title; 
    cb(null, title); 
    }); 

    inspector.on('error', function(error) { 
    cb(error); 
    }); 
} 

... тогда называть это так:

foo.getTitle(src, function(err, title) { 
    if (err) { /* handle error */ } 
    // Handle title 
}); 
Смежные вопросы