我尝试在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首先出现?
答案 0 :(得分:1)
incomeData
在全局范围内定义,并且在首次打印console.log(incomeData)
时未分配任何内容,因此您收到undefined
错误消息。然后调用套接字onmessage
,并为您分配e.data
值console.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>