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.????;
}
答案 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中执行异步响应处理的方法。您不编写顺序,同步函数。您使用事件驱动的回调。