gpt4 book ai didi

node.js - 在事件发射器中的 .emit() 之前调用 .on()——是否存在计时问题?

转载 作者:搜寻专家 更新时间:2023-11-01 00:43:38 24 4
gpt4 key购买 nike

以这段代码为例,其中 f 是一个具有事件“body”的流,它使用 m 调用监听器——它本身就是一个流发射事件:

f.on('message', function(m) {
m.on('body', function(stream, info) {
var b = '';
stream.on('data', function(d) {
b += d;
});
stream.on('end', function() {
if (/^header/i.test(info.which))
msg.header = Imap.parseHeader(b);
else
msg.body = b;
});
});
m.on('attributes', function(attrs) {
msg.attrs = attrs;
msg.contentType = partID[1];
});
});
f.on('end', function() {
if (hadErr)
return;
cb(undefined, msg);
});

后端正在发出一个“消息”事件,并向其传递一个 m 对象。然后代码监听事件 bodyattributes。除了我的小脑袋有点危机(我不习惯与流打交道)外,一切都很简单。特别是:后端如何从 fm 对象发出,以保证事件确实在正确的时间被调用?

具体来说:

  • 一般来说,f 应该如何编码,以确保 mm 在 m.on(' body', function(stream, info) { 被调用了吗?
  • 是否需要在事件发出之前用 on() 添加监听器以便捕获它?
  • 如果是这样,是否意味着 fm 将在此处的代码注册后 发出事件?
  • 如果后端应该保证 b.emit('end') m.emit('end') 之后被调用,那怎么可能呢?真的发生,仍然保证 on() 被调用 before 任何一个事件被发出?

好吧,我对这件事 100% 感到困惑。我显然遗漏了一些基本和关键的东西,因此我什至无法提出正确的问题......! (道歉)

最佳答案

Does a listener need to be added with on() before the event is emitted in order for it to be caught?

是的。

If so, does that mean that f and m will emit events after the code here has registered?

不,事件不会在任何地方排队。如果没有人在听他们,他们就会迷路。我认为这就是您要问的问题... fm 似乎不会在您的代码中发出事件。

If the backend is supposed to guarantee that b.emit('end') is called after m.emit('end'), how is that even supposed to happen really, still guaranteeing that on() is called before any one of the events are emitted?

b 在你的例子中是一个字符串?我不确定你在这里问什么。

换个角度想。当 .on 被调用时,一个函数被订阅到一个消息 channel 。这些消息在该函数被订阅之前就已经在流动,如果该函数被取消订阅,这些消息将继续流动。 .on.removeListener() 只是设置特定功能的订阅状态。

即使没有任何事件在监听它们,也可以发出事件。事件可以一直触发,如果没有监听,它们就不会去任何地方。 (一个异常(exception)是 Node.js 中内置的错误事件,如果没有错误处理程序,它们将变成真正的异常。)

How would f have to be coded, in general terms, in order to make sure that mm doesn't emit till m.on('body', function(stream, info) { is called?

我仍然没有具体遵循您的要求,因为您显示的代码都没有发出任何内容。但是,你不会真的想这样做。您需要在打开流之前设置您的事件处理程序,或者执行您正在做的任何会导致事件被触发的操作。

您可能对新对象的事件处理顺序感到困惑。在 Node.js 中,有一条规则......永远不要直接从构造函数中发出。始终使用 nextTick() 或类似的。这样,在实例化之后,任何将自身附加到事件处理程序的代码都可以在事件发出之前这样做。

此外,如果您正在使用流,请考虑使用 readable 事件,以便流保持暂停状态,直到您准备好从中读取。拉与推。

关于node.js - 在事件发射器中的 .emit() 之前调用 .on()——是否存在计时问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26091844/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com