从套接字接收消息时,Vue.js 数据未更新

Posted

技术标签:

【中文标题】从套接字接收消息时,Vue.js 数据未更新【英文标题】:Vue.js data not updating when receiving message from socket 【发布时间】:2020-09-20 16:35:34 【问题描述】:

我正在尝试设计一个 vue.js 应用程序,该应用程序在从套接字接收到“new_state”消息时更新有关游戏状态的数据。套接字是使用 django 通道实现的。

这就是代码的样子:

const ws_scheme = window.location.protocol == "https:" ? "wss" : "ws"

const gameSocket = new WebSocket(
    ws_scheme +
    '://'
    + window.location.host
    + '/ws/play/'
    + game_id
    + '/'
)
    let vue = new Vue(
        el: '#app',

        data: 
            current_turn: 0,
            last_turn: -1,
            current_card: 0,
            last_card: -1,
            number_of_stacked_cards: 0,
            last_amount_played: 0,
            won_by: -1,
            my_cards: [],
            other_players_data: ,
        ,

        created() 
            gameSocket.onmessage = function(e) 
                data = JSON.parse(e.data)
                this.current_turn = data.state.current_turn
                this.last_turn = data.state.last_turn
               // ... update the other data
            ;
        ,
    );

当我收到消息时,记录数据表明我收到了正确的信息。但是,如果我在收到消息后输入vue.current_turn,它仍然是0,而不是新值; data 对象的所有其他成员都相同。 我尝试使用vue.current_turn = data.state.current_turn,它确实以这种方式工作,但显然它应该与this 一起工作。

我的代码有什么问题?

一般来说,完成我所追求的最佳方式是什么,即在从套接字接收消息时更新内部数据变量?

我必须不使用 socket.io 库,频道不支持它。

【问题讨论】:

【参考方案1】:

问题在于 this 指向的任何调用 gameSocket.onmessage,而不是“普通的 Vue this”。

要解决此问题,您可以在gameSocket.onmessage 上方执行let self = this 并在其中使用self

【讨论】:

谢谢!这很明显,但不知何故我错过了。关于我从套接字消息更新对象状态的一般方法,是我使用最好的方法还是有什么更好的方法? 没问题,这发生在我们所有人身上:) 是的,我认为您用来更新状态的一般方法很好。如果您愿意,可以将其模块化,使用单独的函数进行更新,然后将该函数分解为子函数以使代码清晰。例如。 updateMessage(dataFromSocket) 然后将其分解为 updateThisPartOfTheMessageupdateThatPartOfTheMessage。但这并不是 Vue 特有的,只是模块化的一般编程实践。在 Vue 组件中,这些函数位于 methods 当然可以。祝你好运! 我完全困惑为什么我的 var 在通过套接字发射接收数据后没有更新,虽然我的代码略有不同,但这绝对有效,我也忽略了“this”指向改为套接字.. 感谢@AdamZerner 对我来说同样的问题......我在套接字 onmessage 中分配了一个变量,而不是在我的数据块中...... ughhhh ......非常感谢,@AdamZerner !

以上是关于从套接字接收消息时,Vue.js 数据未更新的主要内容,如果未能解决你的问题,请参考以下文章

Web Socket 消息未全部接收

缓冲读取器未从套接字接收数据

从套接字接收线程中的消息

C中的服务器/套接字编程:数据未正确发送/接收?

套接字 io 仅在最后接收消息

zeromq 模式,用于多客户端从一台服务器推送套接字拉接收