簡體   English   中英

JavaScript事件未觸發(與Websocket的同步連接)

[英]JavaScript event not triggered (sync connection with websockets)

我正在使用websockets開發應用程序。 我有一個事件,它在收到消息時被調用,但是如果發生循環則不會觸發。 我正在嘗試做的是一個同步連接(僅對於這一部分,這就是為什么我使用websockets的原因)。 我的想法是等到收到消息即是我所期望的,然后繼續程序流程。

var connection = new WebSocket('ws://' + location.hostname + ':8888/')
var msgAck=false; //Flag that comes true when received data

connection.onmessage = function (event){
  check(event.data);
}

function check(msg){
  if(msg == "ok")msgAck=true;
}

function requestOk(){
  connection.send("somecmd");
}
//Normal program flow
requestOk();//Server will return "ok"
while(!msgAck);//Wait server response

onmessage事件從未觸發,因此程序被卡在那里。

您不能使用while循環來等待異步響應,而必須使用基於事件的體系結構。 如果您需要等待特定的消息,則應包括該消息的唯一標識符。

var connection = new WebSocket('ws://' + location.hostname + ':8888/')    
connection.onmessage = function (event){
  check(event.data);
}

function check(msg){
  if(msg == "ok"){
    // msgAck Function
    foo(); // call a function here instead of using a while loop
  }
}

function requestOk(){
  connection.send("somecmd");
}
//Normal program flow
requestOk(); //Server will return "ok"

我提到了回調和Promise,因為通常您可以將事件重寫為面向回調/承諾的流程。

function requestOk(cb){
  var connection = new WebSocket('ws://' + location.hostname + ':8888/')    
  var check = function(msg){
    if(msg == "ok"){
      // msgAck Function
      cb(null,msg)
    }else{
      cb("Message not okay.")
    } 
  }
  connection.onmessage = function (event){
    check(event.data);
  }
  connection.send("somecmd");
}
//Normal program flow, callback style
requestOk(function(err,data){
  if(err){
    // Error message
  }else{
    // OK msg
  }
}); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM