【问题标题】:req.on listener callbacks get executed the last in Nodereq.on 侦听器回调在 Node 中最后执行
【发布时间】:2021-06-11 00:10:26
【问题描述】:

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

我熟悉异步,但不知道如何理解这两个:

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

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

【问题讨论】:

    标签: node.js asynchronous callback event-listener


    【解决方案1】:

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

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


    这是一个类比。你去一家餐馆吃饭,它已经满了,而且还有等候名单。

    所以,你给他们你的电话号码,他们说当你的桌子准备好时他们会给你发短信。这就像您注册data 事件一样。

    与此同时,你去街上走一会儿,逛逛橱窗打发时间。这是.on() 调用执行后的其余代码。你遇到一个朋友,他说他想在你吃完晚饭后出去玩。他给你他的电话号码,并让你在吃完晚饭后给他发短信。这就像为end 事件注册处理程序一样。

    你继续在市中心多走一会儿。然后,稍后,您会收到您的餐桌准备就绪的短信。这就像 data 事件的回调被调用来告诉你有数据准备好了。

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

    请注意,在这些不同的事件之间交织在一起,其他常规的事情开始运行(在城里走走,和你的朋友聊天,吃晚餐等等......)。这就像您在等待调用这些事件时运行的其他代码一样。

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

    【讨论】:

    • 感谢您的寓言,您做得很好。除了将函数的所有其余部分重构为“结束”回调之外,还有其他方法吗?
    • @KarolisVinc.Jachimavicius - 是的,只需将该代码移动到该回调中即可。或者把它放在自己的函数中,然后从事件处理程序中调用该函数。这就是事件驱动编程在 nodejs 中的工作方式。
    • 使用 async/await 解决了它。最后!感谢您的帮助。
    猜你喜欢
    • 2021-08-22
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多