Javascript 通过Facebook';有没有办法让迟到的侦听器接收到已经发出的事件?

Javascript 通过Facebook';有没有办法让迟到的侦听器接收到已经发出的事件?,javascript,node.js,reactjs,eventemitter,Javascript,Node.js,Reactjs,Eventemitter,如果我有一个正在获取数据的对象,它发出一个“就绪”事件,但另一个对象在该事件被触发后开始侦听该事件,那么有没有一种直接的方法允许该侦听器接收丢失的事件 纯粹假设的例子(所以请不要问我为什么要这样做): 在上面的示例中,让我们假设DataModule以异步方式获取数据,并且速度非常快。您要求的不是正常的事件发射器功能。因此,您必须通过两个额外的步骤自己实现它: 跟踪给定事件是否已触发的标志,或查询其是否已触发的方法 每次为给定事件添加一个新的侦听器时,检查该事件是否已触发,如果已触发,则立即触发

如果我有一个正在获取数据的对象,它发出一个“就绪”事件,但另一个对象在该事件被触发后开始侦听该事件,那么有没有一种直接的方法允许该侦听器接收丢失的事件

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


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

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

  • 跟踪给定事件是否已触发的标志,或查询其是否已触发的方法
  • 每次为给定事件添加一个新的侦听器时,检查该事件是否已触发,如果已触发,则立即触发侦听器
  • 注意,这正是jQuery的
    .ready()
    基础结构所做的。它添加了上述逻辑本身,因此,如果事件已经发生,则在安装新侦听器时会立即调用它

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



    仅供参考,您可以在此处看到类似的实现:。将
    readyFired
    标志与检查该代码段中的
    文档.readyState
    相结合,可以告诉它事件是否已经发生,如果已经发生,则会调用新的侦听器。

    解决此问题的一种方法是不依赖事件,而是依赖事件。 使用承诺而不是发出事件会将代码更改为:

    function DataModule(){
        this.data = null;
        this.dataPromise = new Promise( function( fulfill, reject ) {
            request.get( 'http://example.com/api/get/data', function( error, response, body ) {
                if ( error ) {
                    reject( error, null );
                }
                else {
                    this.data = body;
                    fulfill( null, body );
                }
            }.bind( this ) );
        }.bind( this ) );
    }
    


    听起来,你可以考虑一个承诺,而不是一个事件,在这种情况下,这是一次发生。ready().then(函数(…){});例如
    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
    
    function DataModule(){
        this.data = null;
        this.dataPromise = new Promise( function( fulfill, reject ) {
            request.get( 'http://example.com/api/get/data', function( error, response, body ) {
                if ( error ) {
                    reject( error, null );
                }
                else {
                    this.data = body;
                    fulfill( null, body );
                }
            }.bind( this ) );
        }.bind( this ) );
    }
    
    var dataModule = new DataModule(); // data fetching happens here.
    
    setTimeout( function(){
        dataModule.dataPromise.then( function( err, data ){
            // Perform some action when the data is ready
        } );
    }, 5000 ); // Five second delay