Событие JavaScript не сработало (синхронизировать соединение с веб-сокетами) - PullRequest
0 голосов
/ 22 мая 2018

Я разрабатываю приложение с веб-сокетами.У меня есть событие, которое вызывается при получении сообщения, но оно не срабатывает, если у меня есть цикл.То, что я пытаюсь сделать, это соединение синхронизации (только для этой части, поэтому я использую веб-сокеты).Моя идея в том, чтобы подождать, пока сообщение получит, то, что я ожидаю, и затем продолжить выполнение программы.

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 голосов
/ 22 мая 2018

Вы не можете использовать цикл 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
  }
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...