我想在我的项目中建立具有聊天模块的通知系统。更具体一点,当我发送消息接收者接收通知时。我已经制作了通知系统及其工作方式。我的问题是当用户打开第二个标签时,我的通知系统不能流畅地工作。
有我的代码
func GetNotification(w http.ResponseWriter, r *http.Request,id ,timestamp int) {
LastMessageTime := -1
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
beego.Error(err)
return
}
wakeupNotification(id)
for {
select {
case notificationTime := <-MessageNotification[strconv.Itoa(id)] :
if notificationTime > LastMessageTime {
LastMessageTime = notificationTime
//MessageNotification[strconv.Itoa(id)] <-notificationTime
chat_services,err := models.GetChatsNotifications(id,timestamp)
if err != nil{
return
}
not := notification{Status:true,MessageList:chat_services}
conn.WriteJSON(not)
}
}
}
}
func SetNotification(id int,timeStamp int){
go func(){
wakeupNotification(id)
MessageNotification[strconv.Itoa(id)] <- timeStamp
}()
}
func wakeupNotification(id int){
_,ok := MessageNotification[strconv.Itoa(id)]
if !ok {
MessageNotification[strconv.Itoa(id)] = make(chan int)
}
}
func SleptNotification(id int){
wakeupNotification(id)
<-MessageNotification[strconv.Itoa(id)]
}
我也有控制器触发
func (c *ChatController) Notification() {
chat.GetNotification(c.Ctx.ResponseWriter,c.Ctx.Request,1,1)
}
func (c *ChatController) DeleteNotification(){
chat.SleptNotification(1)
c.Data["json"] = "readed"
c.ServeJSON();
}
func (c *ChatController) Websocket(){
//odalari olusturup mesajlasma bolumu yapilacak
chat.SetNotification(1,int(time.Now().Unix()))
c.Data["json"] = "test to trigger chan"
c.ServeJSON();
}
我的问题是notificationTime := <-MessageNotification[strconv.Itoa(id)]
一次工作而又无法再次工作。因此,代码永远不会在浏览器第二个标签中再次触发。
你有什么想法吗?
代码工作流利。 对不起英文。 谢谢你的帮助。