Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Socket.IO发出延迟发送_Javascript_Socket.io_Flask Socketio_Emit - Fatal编程技术网

Javascript Socket.IO发出延迟发送

Javascript Socket.IO发出延迟发送,javascript,socket.io,flask-socketio,emit,Javascript,Socket.io,Flask Socketio,Emit,我已经创建了一个Flask SocketIO python服务器,它应该记录来自socket.io JavaScript客户端的数据 服务器: from flask import Flask, render_template from flask_socketio import SocketIO app = Flask(__name__) socketio = SocketIO(app) @socketio.on('connect') def handle_connect(): pr

我已经创建了一个Flask SocketIO python服务器,它应该记录来自socket.io JavaScript客户端的数据

服务器:

from flask import Flask, render_template
from flask_socketio import SocketIO

app = Flask(__name__)
socketio = SocketIO(app)

@socketio.on('connect')
def handle_connect():
    print 'Connected'

@socketio.on('disconnect')
def handle_disconnect():
    print 'Disconnected'

@socketio.on('start')
def handle_start():
    print 'Start'

@socketio.on('log')
def handle_log(data):
    print('Log: ' + data) 

if __name__ == '__main__':
    socketio.run(app)
客户:

<script src="socket.io.js"></script>

<script>
    function sleep(ms) {
        var unixtime_ms = new Date().getTime();
        while(new Date().getTime() < unixtime_ms + ms) {}
    }

    var socket = io.connect('http://127.0.0.1:5000', {'forceNew':true });
    socket.on('connect', function()
    {
        socket.emit('start');
        socket.emit('log', '1');
        socket.emit('log', '2');
        socket.emit('log', '3'); 

        sleep(3000)
    });
</script>

功能睡眠(ms){
var unixtime_ms=new Date().getTime();
while(new Date().getTime()
而不是看到服务器立即打印“开始”、“日志:1”、“日志:2”和“日志:3”

服务器只打印“开始”,3秒后一次打印所有其他消息

这是一个问题,因为我需要实时日志记录,并且无法在执行结束时一次性接收所有日志

你知道为什么会发生这种情况,以及实现这个简单日志服务器的正确方法是什么吗?

你正在使用的
sleep()
函数对JavaScript来说真的很糟糕,因为你不是在睡觉,而是在忙着等待。这意味着CPU在这3秒钟内被占用,因此需要CPU运行的其他任务会被延迟

如果在执行其他操作之前需要等待3秒钟,我建议您使用计时器对象:

window.setTimeout(function() { alert('do something!'); }, 3000);
如果您使用超时睡眠,您将在等待时间内释放CPU,这允许JS调度程序将CPU分配给其他需要它的任务,例如支持Socket.IO发射的任务


希望这有帮助

如果您注释掉
sleep(3000)
调用,它会工作吗?它工作是因为函数结束,并且只有当函数结束时,其他所有发射才会被激发。我需要另一个发射实时发生,而不仅仅是在函数结束时。函数结束这一事实是无关紧要的。这里的关键是调用
sleep()
时正在阻塞。你不能阻止,因为JS是一种异步语言。这与我的问题无关,关键是第一次发射(“开始”)立即(实时)发生,而其他发射由于某种原因被“卡住”,直到函数结束。只有当函数结束时,所有其他发射才会发生。谢谢你的否决票。您似乎不熟悉异步系统的工作原理,因此我建议您继续阅读,以了解为什么您的
sleep()
函数确实存在问题。我感谢您的帮助,但使用sleep只是一个简化问题的示例。我的原始代码是“window.location.reload()”而不是sleep。由于emit调用不会立即发生(它们是异步的),因此重新加载进程和emits调用处于竞争状态,一些emits成功地调用了服务器,但一些emits由于页面已重新加载而丢失。从我所看到的,emit是缓冲请求(1-n)并仅在特定时间刷新它们(例如函数结束)。我需要一种方法来确保emit被刷新,因此我的问题是使用sleep作为一种简化方法。@Michael很抱歉一直给您带来坏消息,但您不能在JavaScript中强制同步发生。这不是一个bug,这是设计工作的方式。事实上,你的一次发射成功了,而另外三次发射没有成功,这只是巧合。在另一台机器上,可能没有人在睡眠呼叫前接通Thorgh,而在另一台机器上,可能有两三个人在你停止睡眠前接通Thorgh。你对此无能为力。但是,您可以做的是正确地设计应用程序,使其能够处理异步调用。如果您希望发出一系列内容,然后调用重新加载,只需在上次发出时附加一个回调,然后在发出完成并调用回调时执行重新加载。