2013-08-04 59 views
1

我正在使用expressjs。 我有一個路由器:如何在異步函數完成後發送json

exports.index = function(req, res){ 

    if(req.param('name')) { 

    var simpleParser = require('../tools/simpleParser'); 
    var result = simpleParser.images(req.param('name')); 

    // how i can get result from simpleParser.images after it complete? 

    res.json(result); 

    } 

    res.render('goods'); 

}; 

的我有一個simpleParser.images:

module.exports = { 
    images: function (url) { 
     if (url) { 

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

      request({ 
       uri: url, 
       method: 'GET', 
       encoding: 'binary' 
      }, function (err, res, body) { 

       var tmp = []; 

       body = new Buffer(body, 'binary'); 

       var $ = cheerio.load(body); 

       $('.products-listing li a').each(function() { 
        var link = $(this).find('img').attr('src'); 
        tmp.push(link); 
       }); 

       // How i can send tmp to router, when it complete? 

      }); 

     } 
    } 
}; 

當我問與頁面命名返回null,因爲請求simpleParser.images工作異步。如何訂閱simpleParser請求函數的結果,並在完成後發送json?

回答

0

與許多節點模塊一樣,您可以在自己的實用功能中提供回調。您的simpleParser.images功能不同步,因爲它使用request模塊。你可以讓你的simpleParser.images函數接受一個回調,這個回調將在網絡請求和一些數據解析完成時被調用。

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

module.exports = { 
    images: function (url, callback) { 
    if (!url) callback(null, null); 

    request({ 
     uri: url, 
     method: 'GET', 
     encoding: 'binary' 
    }, function (err, res, body) { 
     if (err) callback(err); 
     var tmp = []; 
     body = new Buffer(body, 'binary'); 
     var $ = cheerio.load(body); 
     $('.products-listing li a').each(function() { 
     var link = $(this).find('img').attr('src'); 
     tmp.push(link); 
     }); 

     // Here we have the data and can pass it in the callback 
     callback(null, tmp); 
    }); 
    } 
}; 

然後,你基本上有你自己的功能,可以異步執行。然後在您的 快遞路線中,這也是異步的,因此只需插入您的新功能

if (req.param('name')) 
    simpleParser.images(req.param('name'), function (err, images); 
    res.json(images); 
    }); 
} else { 
    res.render('goods'); 
} 
相關問題