使用 npm 包请求处理成功事件

Handle on success event with npm package request


我有一个 node.js 应用程序可以从网站上抓取信息。我正在使用 npm packages request 和 cheerio 并且抓取工作正常但我想在请求功能完成后做其他事情。这是一些代码:
app.js

var express = require('express');
var extractor = require("./extractor");
console.log(extractor('http://www.example.com'));
var app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});
app.listen(3000);

extractor.js(所有的乐趣)

var request = require('request');
var cheerio = require('cheerio');
var Extractor = function(url) {
    var games = [];
    request(url, function (error, response, html) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);
            $('tr.game').each(function(i, v){
                var game = { /* many attributes */ };
                games.push(game);
            });
        }
    });
    this.extractedGames = games;
};
module.exports = function(url) {
    return new Extractor(url);
};

最终当我 运行 它显示 { extractedGames: [] } 那是因为输出是在请求处理结束之前打印的。所以我想在请求作业结束时向 extracedGames 属性添加一个 on success 事件。

谢谢

自己解决了!我希望这可以帮助将来的人(虽然我觉得自己是个十足的菜鸟)
诀窍是发出一个事件并稍后处理它。

var express = require('express');
var extractor = require("./extractor");
extractor('http://www.example.com');
var app = express();
app.get('/', function (req, res) {
  res.send('Hello world\n');
});
app.listen(3000);

我删除了 console.log(extractor('http://www.example.com')),因为这会在请求作业完成之前 运行。所以我把它移到了事件处理函数中。

var request = require('request');
var cheerio = require('cheerio');
var Emitter = require('events').EventEmitter;
var extractEmitter = new Emitter();
extractEmitter.on('extracted', function(extractedGames){
    console.log(extractedGames);
});
var Extractor = function(url) {
    var games = [];
    request(url, function (error, response, html) {
        if (!error && response.statusCode == 200) {
            var $ = cheerio.load(html);
            $('tr.game').each(function(i, v){
                var game = { /* many attributes */ };
                games.push(game);
            });
            extractEmitter.emit('extracted', games);
        }
    });
    this.extractedGames = games;
};
module.exports = function(url) {
    return new Extractor(url);
};