0

我试图了解 Node.js 中的事件循环,以及事件编程的工作原理。鉴于我的模块导出了一个函数,该函数在event的回调中返回一些内容data

var http = require('http');

module.exports.send = function send(message) {
    http.request({ hostname: 'google.com' }, function (res) {
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            return chunk;
        }
    });
};

这怎么行?

如果我理解正确,http.request异步操作,这意味着:

  1. 执行调用http.request
  2. 程序控制立即返回 Node.js事件循环;
  3. 当请求最终返回某些东西(data事件被发出)时,可能在几分钟后send函数返回数据。不是以前。

因此result应该是undefined,但实际上不是:

var send = require('mymodule').send;

var result = send({});
console.log(result);
4

1 回答 1

1

要考虑的主要事情是调用data回调的内容。在这种情况下,该函数是从 Node 内部的一个随机位置调用的,因此当您return chunk;将该块返回到 Node 的该部分时,您不会将它返回到您自己的代码中,因为它已经完成了运行。

如果您想实际获取该数据,则需要将您自己的回调传递给该回调,该回调send将在数据返回时触发。

module.exports.send = function send(message, callback) {
  http.request({ hostname: 'google.com' }, function (res) {
    res.setEncoding('utf8');

    res.on('data', function (chunk) {
        callback(chunk);
    });
  });
};

然后像这样调用:

var mod = require('...');
mod.send('message data', function(result){
   console.log(result);
});

请记住,该data事件可以发出任意次数,因此您需要收集所有chunk值,然后在end事件触发后调用您的回调。

于 2013-02-16T19:54:36.990 回答