gpt4 book ai didi

javascript - 使用 Facebook 的 EventEmitter 有没有办法让迟到的监听器接收到已经发出的事件?

转载 作者:太空宇宙 更新时间:2023-11-04 00:57:58 24 4
gpt4 key购买 nike

如果我有一个正在获取数据的对象,并且它发出一个“就绪”事件,但另一个对象在该事件被触发后开始监听该事件,是否有一种直接的方法允许该监听器接收该错过的事件。

纯粹假设的示例(所以请不要问我为什么要这样做):

function DataModule(){
this.data = null;
request.get( 'http://example.com/api/get/data', function( error, response, body ) {
if ( ! err ) {
this.data = body;
this.emit( 'ready' );
}
}.bind( this ) );
}

...

var dataModule = new DataModule(); // data fetching happens here.
setTimeout( function(){
dataModule.once( 'ready', function(){
// Perform some action when the data is ready
} );
}, 5000 ); // Five second delay

在上面的示例中,我们假设 DataModule 异步获取数据,而且速度非常快。

最佳答案

您要求的不是普通的事件发射器功能。因此,您必须通过两个额外步骤自行实现:

  1. 用于跟踪给定事件是否已触发的标志或查询该事件是否已触发的方法。
  2. 每次为给定事件添加新监听器时都会检查该事件是否已触发,如果是,则只需立即触发监听器。

注意,这正是 jQuery 的 .ready() 基础结构所做的事情。它添加了上述逻辑本身,因此如果事件已经发生,任何新的监听器在安装时都会立即被调用。

并且,这显然假设该事件是一次性类型的事件(只会发生一次)。而且,您需要能够知道事件是否已经发生。

<小时/>

仅供引用,您可以在此处看到类似的实现:pure JavaScript equivalent to jQuery's $.ready() how to call a function when the page/dom is ready for it 。该代码段中的 readyFired 标志和 document.readyState 检查的组合告诉它事件是否已经发生,如果是,则调用新的监听器。

关于javascript - 使用 Facebook 的 EventEmitter 有没有办法让迟到的监听器接收到已经发出的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28770464/

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