1

私はexpressjsを使用しています。私はルーターを持っています:

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?

            });

        }
    }
};

?name でページを要求すると、simpleParser.images の要求が非同期で動作するため、null が返されます。simpleParser リクエスト関数の結果をサブスクライブし、完了後に json を送信するにはどうすればよいですか?

4

1 に答える 1

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');
}
于 2013-08-04T19:09:42.883 に答える