等待插座时是否可以冻结?


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

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

像这样,无限循环。

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

};

像这样,它在"peanuts = data;"之前返回"Peanuts[0]"。

请帮助我。


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

发现它可以发送确认。. 但是我希望控制台.log(答案(在控制台.log("鸭子"(之前运行


好吧,其实我的代码是这样的。.

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

如果我使用这种"同步样式"(但不同步(,我需要重写函数便便,对吧?这就是为什么我想要同步,出于某种原因,我只能重写函数 a,那么,是否可以检查为 while 的条件而不是使用确认或使用侦听器发出?

喜欢这个?

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

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

不,这在Javascript中是不可能的。 您不能在等待网络事件到达时"阻止"解释器。 由于 Javascript 的事件驱动设计,如果您执行一个尝试等待值的while()循环,则while()循环将阻塞事件循环,以便永远无法处理结果。 因此,你最终会陷入僵局,本质上是一个永远不会完成的循环。

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

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

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

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

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

有关返回异步值的更多详细信息,请参阅有关该主题的规范答案。


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

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

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

最新更新