未触发JavaScript事件(与websockets同步连接)

时间:2018-05-22 12:37:49

标签: javascript events websocket

我正在开发一个带有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事件从未触发,因此程序会卡在那里。

1 个答案:

答案 0 :(得分:0)

您不能使用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"

我提到了回调和承诺,因为通常你可以将事件重写为回调/承诺流程。

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
  }
});