req.on 监听器回调在 Node 中最后执行

req.on listener callbacks get executed the last in Node

我在请求正文中发送了一个 JSON,应该对其进行操作。但是写入和结束数据的两个 req.ons 被执行,如命令提示符所示,在它们所在的函数的其余部分之后,所以我没有得到我的 JSON 和程序的其余部分抛出错误。

我熟悉异步性,但不知道如何弄清楚这两个问题:

   req.on('data', function(data){
    buffer += decoder.write(data);
    });
 
   req.on('end', function(data){
     buffer += decoder.end(data);
   })

在那里找了四个小时,还没找到解决办法。

是的,dataend 事件是 asynchronous。这意味着它们会在一段时间后出现,在您注册事件处理程序很久之后。而且,.on() 是非阻塞的,因此它会注册事件处理程序,然后立即 returns 并且在您调用 .on() 之后放置的代码将在安装事件处理程序后立即执行。这些事件的回调将在将来的某个时间被调用,if/when 该事件发生。

当收集完所有数据后,您想要 运行 的代码必须插入 end 事件处理程序或放入您从那里调用的函数。


打个比方。你去饭店吃饭,满满的还有等候名单。

所以,你给他们你的 phone 号码,他们说当你的 table 准备好时他们会发短信给你。这就像您注册了 data 活动。

与此同时,您可以在街上走一会儿,然后 window 购物消磨时间。这是 .on() 调用执行后的其余代码。你 运行 变成了一个朋友,他说他想在你吃完晚饭后出去玩。他给了你他的电话号码,让你吃完晚饭给他发短信。这就像您为 end 事件注册处理程序一样。

你继续在市中心走一会儿。然后,稍后,您会收到一条短信,说明您的 table 已准备就绪。这就像调用 data 事件的回调来告诉您数据已准备就绪。

你吃晚饭,吃完晚饭后,你给朋友发短信说你吃完了。这就像 end 事件。

请注意,在这些不同的事件之间交织在一起,其他常规事情会发生 运行(在城里散步、与朋友聊天、吃晚饭等)。这就像您在等待调用这些事件时 运行 的其他代码。

想要在非常特定的时间(例如其中一个事件发生时)运行 的代码必须在该事件的特定事件处理程序中。