为websocket中的onmessage中的变量赋值

时间:2016-12-25 15:39:02

标签: javascript websocket

我尝试在onmessage函数中为变量赋值:

socket = new WebSocket(ws_scheme +"127.0.0.1:8000/chat/");
var incomeData;
socket.onmessage = function(e) {
     incomeData='hello'+ e.data; 
     console.log('inside function:'+incomeData)
}
socket.onopen = function() { 
    socket.send(" from websocket");
}
 console.log(incomeData)

控制台将第一个日志显示为undefined,第二个" inside函数:hello from websocket"。如何获取分配的变量并将值保留在函数外部?为什么第二个console.log首先出现?

2 个答案:

答案 0 :(得分:1)

incomeData在全局范围内定义,并且在首次打印console.log(incomeData)时未分配任何内容,因此您收到undefined错误消息。然后调用套接字onmessage,并为您分配e.dataconsole.log然后打印出来。

您可以处理socket.onmessage并将e.data传递给这样的回调函数:

socket = new WebSocket(ws_scheme +"127.0.0.1:8000/chat/");

socket.onmessage = function(e) {
    socket_onmessage_callback(e.data);
}

socket.onopen = function() { 
    socket.send(" from websocket");
}

function socket_onmessage_callback(data) {
    console.log('inside function socket_onmessage_callback:', data)
}

如果需要,您甚至可以使用incomeData全局变量,但我认为不需要。如果您需要使用incomeData,可以更新我的答案。

答案 1 :(得分:0)

一旦掌握了websocket协议的要点,就可以通过回调函数轻松地更新全局变量,该函数将传递给协议的websocket.onmessage方法。要点是,后端服务器不是根据客户端的GET或POST或其他信息,而是在需要时向客户端发送信息。没有办法强迫websocket端点返回任何东西,即使您没有要求,它也可以在需要时返回。打开ws://连接后,请准备在任何意外时间通过此连接接收数据。您需要做的是确保您的应用不会在要分配的变量的初始(或undefined)值上崩溃,并且只允许服务器在服务器(而不是您)更新变量时使用!)想要。这是一个具有自调用ws://连接初始化((function(...) {...})(...);结构)和回调的工作代码示例:

<script>    
    var yourGlobalField = undefined;
    
    console.log("Value before update: ", yourGlobalField);

    (function initWebsocketConnection() {

        websocket = new WebSocket("ws://your.websocket.URI");

        websocket.onmessage = function (evt) {
            theFunctionNeededToMakeSureWeHaveReceivedRealData(evt, yourSuccessCallbackFunction(evt));
        };

        websocket.onerror = function(err) {
            networkError(err);
        }

    })();

    function theFunctionNeededToMakeSureWeHaveReceivedRealData(evt) {
        console.log("we have received some data!");
    }

    function yourSuccessCallbackFunction(data) {
        yourGlobalField = JSON.parse(data); //just assuming you receive a JSON object
        console.log("Value after update: ", yourGlobalField)
    }

    function networkError(err) {
        console.log('Request Failed', err);
    }
</script>