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