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