离子事件触发太多次。每次触发时增加一?

Posted

技术标签:

【中文标题】离子事件触发太多次。每次触发时增加一?【英文标题】:Ionic event fires too many times. Incremented by one each time it's triggered? 【发布时间】:2018-08-09 09:03:39 【问题描述】:

TL;DR:订阅事件触发次数过多。

我设置了一个事件,当实时数据通过套接字进入时,该事件会被触发。

通过控制台日志我发现,实时数据只正确输入一次。被触发的事件,当实时数据进来时,也只会被触发一次:

console.log("Event publish got fired!");
this.events.publish(EVENTSLUG_STAMP_UPDATE);

每次数据进入时我只看到这个控制台日志一次。

奇怪的部分来了:订阅事件触发了多次!每次实时数据进来,都会再次触发一次。

this.events.subscribe(EVENTSLUG_STAMP_UPDATE, () => 
  console.log("Event gets gets handled!");
  // Do some code here. This code gets done to many times.
);

所以我看到第一次实时数据进来:

Event publish got fired!
Event gets gets handled!

在控制台中。第二次,我明白了

Event publish got fired!
Event gets gets handled!
Event gets gets handled!

我第三次看到:

Event publish got fired!
Event gets gets handled!
Event gets gets handled!
Event gets gets handled!

等等。我正在使用 socket.io 获取实时数据。但正如我所说,用控制台日志填充我的代码我得出的结论是,只有订阅事件会触发多次。每次事件再次发布时递增 1。

编辑

我找到了一个可行的解决方法:

this.events.subscribe(EVENTSLUG_STAMP_UPDATE, () => 
  this.navCtrl.setRoot('ScanSuccessPage').then(() => 
    this.events.unsubscribe(EVENTSLUG_STAMP_UPDATE);
  );
);

【问题讨论】:

this.events.subscribe 在哪里...? 在被设置为 root 的页面的构造函数内部,例如 navCtrl.setRoot('PageWIthSubscription')。我找到了解决方法,请参阅编辑 :) 【参考方案1】:

所以我也花了一点时间来解决这个问题。对我来说,最终结果是我在一个组件上使用了subscribe(),当我在应用程序中导航时,该组件被销毁并重新创建,但是我在使用unsubscribe() 的组件上没有OnDestroy 事件处理程序,所以每次它被实例化了,它添加了另一个订阅处理程序。

注意:您还必须将 same 事件处理程序传递给unsubscribe(),请参阅Ionic2: Unsubscribe Event to Avoid Duplicate Entries?

【讨论】:

【参考方案2】:

不再使用时删除它(遗憾的是它不使用“一次”)

//handler as property
private handler=(args)=>...;


...    

events.subscribe(handler); 

...

notMoreNeeded()//call this when you don't want event is shooted more
    this.events.unsubscribe(handler)

【讨论】:

如果您打算在从另一个页面弹出时使用该订阅,您可能不应该放在这里。 ionViewWillUnload 可能是一个更好的地方

以上是关于离子事件触发太多次。每次触发时增加一?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery单击事件多次触发

如果我每次都从不同的线程调用事件,为啥会从同一个线程触发事件处理程序的多次执行?

jquery为啥触发多次click事件

jquery popup中的事件被多次触发

解决vue使用bus被多次触发问题

离子 - Routerlink 不触发生命周期事件