最近我在 Vue 项目中实现了 Pusher ChatKit。
我已经浏览了js文档,但我对启动应用程序的流程感到困惑,以便我有新消息的活跃侦听器。
我有5个房间,currentUser
是其中的一部分。
当我这样做时
chatManager
.connect()
.then(currentUser => {
})
我得到了当前用户,我可以访问他的rooms
和roomSubscriptions
。
1( 有什么区别?用户所属的任何房间也应该是他订阅的房间,不是吗?
文档说我需要订阅每个用户房间才能设置onNewMessage()
钩子。
所以我是这样做的:
chatManager
.connect()
.then(currentUser => {
this.initiateNewChatState(currentUser)
})
initiateNewChatState(currentUser){
for(let room of currentUser.rooms){
currentUser.subscribeToRoom({
roomId: room.id,
hooks: {
onNewMessage: message => {
console.log(`Received new message ${message.text}`)
this.$store.commit('CHATKIT_message', message)
}
},
messageLimit: 10
})
}
}
2(但是现在当我只收到一个房间的新消息时,每个房间钩子都会触发钩子(5次(。
现在,一旦我完成了订阅循环,下次运行时就不需要这样做chatManager.connect()
因为currentUser.roomSubscriptions
已经填满了我上次订阅的房间,甚至在调用this.initiateNewChatState()
之前。
3(这就引出了一个问题,订阅用户已经参与的用户房间的正确流程是什么,以及如何检测新消息和新房间创建(当有人开始与您聊天时(?
该文档确实简化了,无法在实际案例中实现。有人有这方面的经验吗?
谢谢!
不幸的是,这是目前唯一的方法。在Pusher ChatKit中,每个操作都取决于当前用户和用户对房间的订阅。用户不一定订阅他/她是其成员的聊天室。 它既有利也有弊。 但是现在我可以说,您可以设置messageLimit: 0
.这不会在您首次加载页面时提取所有消息。 而是在用户单击房间以查看消息时使用以下方法提取消息:
currentUser.subscribeToRoom({
roomId: room.id,
hooks: {
onNewMessage: (message) => {
// do something with the message
},
onUserStartedTyping : (user) => {
// do something with the user
},
onUserStoppedTyping : (user) => {
// do something with the user
},
},
messageLimit: 10
});