因此,基本上,我有一个应用程序,当我收到短信时,后端使用graphql捕获它,然后发布事件总线,所有订阅该事件总线的通道都会实时接收到通知到前端显示屏。
我的问题是,我的后端仅发布一次通知,但是我的前端收到通知的频率更高,如指数级。例如,发布的第一个通知会被捕获一次。第二个发布捕获2,然后捕获4 8等等...
我相信原因是订阅方法前端会重新执行事件总线中的所有事件,并真的经常执行同一事件。
这是一些代码示例:
这是发布事件的代码:它将通知添加到我的数据库中,并发布事件以通知浏览器进行更新。
function addNotification( from, to, body , date){
//retrieve the last notifications received from this number to this number and crush it with this new notification
let database = firebase.firestore();
database.collection('notifications').where('from','==',from).where('to','==',to).get()
.then(function (querySnapshot) {
if(querySnapshot.empty) {
console.log('publish')
let data = { from:from, to:to, body:body, date:date }
database.collection('notifications').doc().set(data)
pubsub.publish(NOTIFICATIONS_ADDED, { notificationAdded: {from:from,to:to,body:body,date:date}});
} else {
querySnapshot.forEach(function (doc) {
var data = {
body:body,
date:date
}
console.log('publish')
database.collection("notifications").doc(doc.id).set(data, { merge: true });
pubsub.publish(NOTIFICATIONS_ADDED, { notificationAdded: {from:from,to:to,body:body,date:date}});
});
}
}).catch(err => {
console.log(err)
throw Error(err.toString());
})
}
这是预订getNewNotificationSubscription的代码前端
_subscribeToMoreNotifications = subscribeToMore => {
subscribeToMore({
document: getNewNotificationsSubscription,
updateQuery: (prev, { subscriptionData }) => {
console.log('received')
if (!subscriptionData.data) return prev
if (!subscriptionData.data.notificationAdded) return prev
const newNotifications = subscriptionData.data.notificationAdded
return Object.assign({}, prev, {
getSMSNotifications: [ newNotifications, ...prev.getSMSNotifications ]
})
}
})
}
我猜想,一种锻炼方式是检查最后收到的数据是否与以前收到的数据相同,但是并不能解决我多次收到相同数据的问题。
此外,在我的后端打印屏幕上,我们可以看到 MaxListenersExceededWarning:检测到可能的EventEmitter内存泄漏。添加了11个NOTIFICATIONS_ADDED侦听器。使用Emitter.setMaxListeners()增加限制发布,这看起来不太好。但是,我只有一个监听notifications_added的侦听器。
知道发生了什么吗?