is it possible to freeze while waiting for a socket?

时间:2018-06-04 17:48:02

标签: javascript socket.io

socket.on('res', function(data) {  
    peanuts = data;
});


abc = function(){
    peanuts = [];
    socket.emit('req', index);
    while (!peanuts[0]) {};    
    return peanuts[0];
};

like this, infinite loop.

abc = function(){
peanuts = [];
var intr = setInterval(function(){
    if (peanuts[0]) {
        clearInterval(intr);            
    };
}, 100)
return peanuts[0];

};

like this, it returns "peanuts[0]" before the "peanuts = data;"

pls help me.


socket.emit('req', index, function(answer) {
    console.log(answer);
});  
console.log('duck');

found that it could sending with acknowledgement.. but i want console.log(answer) run before console.log('duck')


OK,Actually my code is like this..

function poo() {
    var x = a() & b();
    /*
    blablabla.....
    */
    return z;
}

function a() {
    socket.emit('req', index, function(answer) {
        var temp = answer
    });  
    return temp;
}

console.log(poo());

And if I use that ‘sync style’(but not sync), I need to rewrite function poo,right? That's why I want sync, for some reason, I can only rewrite function a, so, is it possible to check as the condition of while instead of emit with acknowledgement or using listener?

Like this?

function a() {
    socket.emit('req', index);
    while (!socket.???) {
    };
    return socket.????;
}

1 个答案:

答案 0 :(得分:0)

  

等待套接字时是否可以冻结?

不,在Javascript中不可能。在等待网络事件到达时,您无法“阻止”解释器。由于Javascript的事件驱动设计,如果您执行试图等待值的while()循环,while()循环将阻止事件循环,以便永远不会处理结果。因此,您最终会遇到死锁,并且本质上是一个永远不会完成的循环。

  

我真的想要同步,在这种情况下是不可能的?

这是不可能的。 Javascript和socket.io的事件驱动特性要求您使用该事件驱动的体系结构,而不是阻塞的同步体系结构。要使用阻塞的同步体系结构,您需要一种支持线程和阻塞I / O的不同语言和环境(例如Java)。

该操作是异步的,因此您必须对函数进行编程以异步正确地返回值。该函数应该返回一个在值到达时解析的promise或者函数应该在值到达时调用的回调。或者,您可以直接使用已在.emit()内置的回调来处理回调中的结果(如下所示)。

然后调用代码需要适应使用异步结果。这就是异步编程在Javascript中的工作原理。要使用异步操作,您必须学习如何异步编程。

您需要编写事件驱动的代码,而不是阻止代码。设置事件侦听器或promise,然后在该事件触发或调用回调时继续您的进程。很难对代码如何工作提出具体建议,因为你主要显示的是伪代码,而不是真正的代码。

有关返回异步值的更多详细信息,您可以在主题上看到this canonical answer

仅供参考,如果您尝试使用socket.io,其模式类似于请求/响应,您希望发送请求消息的特定响应,则socket.io具有使用回调的功能.emit()(服务器必须合作才能完成这项工作):

socket.emit('req', index, function(answer) {
    // put code here that uses the answer
});  

这是您在Javascript中执行异步响应处理的方法。您不编写顺序,同步函数。您使用事件驱动的回调。