【问题标题】:Understanding Node.js code for emit function esp了解用于发出函数 esp 的 Node.js 代码
【发布时间】:2015-12-01 08:22:53
【问题描述】:

我很难完全掌握下面的代码。我想了解emit的工作原理。

这是我对下面代码中提到的所有发射实例的理解。

  1. profileEmitter.emit("error", new Error("There was an error getting the profile for " + username + ". (" + http.STATUS_CODES[response.statusCode] + ")"));

它执行错误函数。(但我不确定代码中哪里定义了错误函数。

  1. response.on('data', function (chunk) { body += chunk; profileEmitter.emit("data", chunk); });

这会发出一个如上定义的数据事件函数。一切都好!但是第二个参数是什么。根据文档,这个参数应该是一个监听器,但它只是一个参数——在数据之前定义的“匿名函数”。

  1. try { //Parse the data var profile = JSON.parse(body); profileEmitter.emit("end", profile); } catch (error) { profileEmitter.emit("error", error); }

try 块中的第一个发射这次有一个profile 变量。 catch 块中的第二个发射具有 error 作为第二个参数。好 !都糊涂了。

var EventEmitter = require("events").EventEmitter;
var http = require("http");
var util = require("util");


function Profile(username) {

EventEmitter.call(this);

profileEmitter = this;

//Connect to the API URL (http://teamtreehouse.com/username.json)
var request = http.get("http://example.com/" + username + ".json", function(response) {
    var body = "";

    if (response.statusCode !== 200) {
        request.abort();
        //Status Code Error
        profileEmitter.emit("error", new Error("There was an error getting the profile for " + username + ". (" + http.STATUS_CODES[response.statusCode] + ")"));
    }

    //Read the data
    response.on('data', function (chunk) {
        body += chunk;
        profileEmitter.emit("data", chunk);
    });

    response.on('end', function () {
        if(response.statusCode === 200) {
            try {
                //Parse the data
                var profile = JSON.parse(body);
                profileEmitter.emit("end", profile);
            } catch (error) {
                profileEmitter.emit("error", error);
            }
        }
    }).on("error", function(error){
        profileEmitter.emit("error", error);
    });
});
}

util.inherits( Profile, EventEmitter );

module.exports = Profile;

【问题讨论】:

  • response.on('data', …)发出“数据侦听器函数”。不知道你的意思。
  • 糟糕!它应该是数据事件,然后是侦听器函数。我会纠正这个问题。谢谢!

标签: javascript node.js


【解决方案1】:

EventEmitter.emit() 函数正如它所说的那样:它向为所述事件注册的侦听器发送一个事件。

第一个之后的参数(事件类型)只是事件的参数,它们不是监听器。

因此,您的第一次调用只需发送一个error 事件,并附加一个描述错误的Error 参数。

第二个调用发送一个data 事件,以及刚刚收到的数据块。

第三个调用发送一个end 事件以及解码的配置文件。

最后一次调用发送一个error 事件,以及从catch 收到的错误。

【讨论】:

  • 好的,有帮助!但是在 node.js 中执行函数代码是否需要发出函数?
  • 还有一个问题。你说第二个参数也可以是数据。但根据文档,他们提到事件将由监听器跟随,根据我的说法,监听器只是函数。如有错误请指正!
  • 我认为您对文档的解释不正确。 nodejs.org/api/events.html#events_emitter_emit_event_arg1_arg2 表示 emit “使用提供的参数按顺序调用每个侦听器”。监听器不提供发射,它们使用ononce 注册。 emit 将调用已为该事件注册的所有侦听器,并将提供的参数传递给侦听器。您引用的代码未显示侦听器部分。
  • 好的!这正是我担心这里的代码没有提供文档中指定的侦听器。相反,它只是在on 方法中传递匿名回调的chunk 参数。所以我的困惑仅仅是因为文档说listener 而不是listener/data。但是您的解释很清楚,也可以传递数据!希望这次我做对了!
  • 好吧,这段代码的目标是定义一个可以监听的新对象。它基本上是启动一个 HTTP 请求,监听它,然后将数据(和错误)传递给你设置的监听器。因此,您将在代码的其他位置创建此对象,并添加侦听器以监视返回接收到的解码配置文件的 end 事件,以及可能的 errordata 事件。
【解决方案2】:

EventEmitter 的所有概念与 java 中的 Observer pattern 相同(如果您来自 java 世界),您观察您对示例 data 事件感兴趣的事件,并且每次您通过 @ 发出 data 事件987654324@,由on('data', handlerfunction)订阅事件的事件处理器处理。

error是nodejs中的一个特殊事件,如果你不处理它只会炸毁你的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-04
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多