如何等待传递给 Flask-SocketIO 的 emit() 的回调?
How to wait for a callback passed to Flask-SocketIO's emit()?
在Flask-SocketIO
中有没有办法让blocking/synchronousemit('event', callback)
函数等待回调通过在 returning?
之前
或——有没有办法直接在@socketio.on('event')
处理程序而不是来自该处理程序的普通 return
?
这是我的具体情况:
+-----------------+ +----------------------+ +----------------------+
| Browser | emit('serverGiveData', | Flask | emit('workerGiveData', | Worker |
| (webapp, JS) | browser_callback) | web server | server_callback) | (Python program) |
| | +------------------------> | | +--------------------> | |
| | | | | |
| socket.io 1.7.3 | data | Flask-SocketIO 2.8.2 | data |socketiIO-client 0.7.2|
| | <------------------------+ | | <--------------------+ | |
| | | | | |
+-----------------+ +----------------------+ +----------------------+
因此 浏览器 需要来自 Worker 和 的 data Flask 网络服务器 只是两者之间的代理。
我希望在 Server 从 接收到 data 之后调用 browser_callback()
工人.
(即我想从 server_callback()
调用 browser_callback()
)。
但是,我无法在 Flask-SocketIO 中手动从 server_callback()
调用 browser_callback()
-- 它当我从 Server 上的 'serverGiveData'
处理程序函数 return 时调用 "automatically"。这就是为什么我想要 blocking/synchronous emit('workerGiveData')
以便 Server 上的处理程序不会 return 在 Worker 传递数据之前。
这是代码
浏览器
socketio.emit('serverGiveData', args, function (data) {
console.log('Received data');
});
服务器
@socketio.on('serverGiveData')
def handler(msg):
socketio.emit('workerGiveData', msg, callback=server_callback)
return # When server_callback() gets called back
def server_callback(data):
print('Received data from Worker')
# Here I want to invoke client_callback(), i.e.
# I don't want handler() to return before this server_callback() is invoked
工人
def handler(args, callback);
callback(data)
socketIO.on('workerGiveData', handler)
(我知道我可以 emit('heyBrowserHeresData')
来自 server_callback()
当 Worker 传送数据并在浏览器中使用 browser_callback()
代码作为处理程序监听该事件。
我想避免那种混乱。)
Socket.IO 协议是基于事件的,而不是request/response。我建议您不要使用回调,回调是为了快速确认收到事件,而不是在完成一些工作后提供结果。
尝试使用新事件代替回调:
+-----------------+ +----------------------+ +----------------------+
| Browser | emit('serverGiveData’) | Flask | emit('workerGiveData', | Worker |
| (webapp, JS) | | web server | server_callback) | (Python program) |
| | +------------------------> | | +--------------------> | |
| | | | | |
| socket.io 1.7.3 | emit(‘dataForBrowser’) | Flask-SocketIO 2.8.2 | data |socketiIO-client 0.7.2|
| | <------------------------+ | | <--------------------+ | |
| | | | | |
+-----------------+ +----------------------+ +----------------------+
如果适合您,您可以将第二个回调留在服务器端,或者更少,您也可以用事件替换它。
在Flask-SocketIO
中有没有办法让blocking/synchronousemit('event', callback)
函数等待回调通过在 returning?
或——有没有办法直接在@socketio.on('event')
处理程序而不是来自该处理程序的普通 return
?
这是我的具体情况:
+-----------------+ +----------------------+ +----------------------+
| Browser | emit('serverGiveData', | Flask | emit('workerGiveData', | Worker |
| (webapp, JS) | browser_callback) | web server | server_callback) | (Python program) |
| | +------------------------> | | +--------------------> | |
| | | | | |
| socket.io 1.7.3 | data | Flask-SocketIO 2.8.2 | data |socketiIO-client 0.7.2|
| | <------------------------+ | | <--------------------+ | |
| | | | | |
+-----------------+ +----------------------+ +----------------------+
因此 浏览器 需要来自 Worker 和 的 data Flask 网络服务器 只是两者之间的代理。
我希望在 Server 从 接收到 data 之后调用 browser_callback()
工人.
(即我想从 server_callback()
调用 browser_callback()
)。
但是,我无法在 Flask-SocketIO 中手动从 server_callback()
调用 browser_callback()
-- 它当我从 Server 上的 'serverGiveData'
处理程序函数 return 时调用 "automatically"。这就是为什么我想要 blocking/synchronous emit('workerGiveData')
以便 Server 上的处理程序不会 return 在 Worker 传递数据之前。
这是代码
浏览器
socketio.emit('serverGiveData', args, function (data) {
console.log('Received data');
});
服务器
@socketio.on('serverGiveData')
def handler(msg):
socketio.emit('workerGiveData', msg, callback=server_callback)
return # When server_callback() gets called back
def server_callback(data):
print('Received data from Worker')
# Here I want to invoke client_callback(), i.e.
# I don't want handler() to return before this server_callback() is invoked
工人
def handler(args, callback);
callback(data)
socketIO.on('workerGiveData', handler)
(我知道我可以 emit('heyBrowserHeresData')
来自 server_callback()
当 Worker 传送数据并在浏览器中使用 browser_callback()
代码作为处理程序监听该事件。
我想避免那种混乱。)
Socket.IO 协议是基于事件的,而不是request/response。我建议您不要使用回调,回调是为了快速确认收到事件,而不是在完成一些工作后提供结果。
尝试使用新事件代替回调:
+-----------------+ +----------------------+ +----------------------+
| Browser | emit('serverGiveData’) | Flask | emit('workerGiveData', | Worker |
| (webapp, JS) | | web server | server_callback) | (Python program) |
| | +------------------------> | | +--------------------> | |
| | | | | |
| socket.io 1.7.3 | emit(‘dataForBrowser’) | Flask-SocketIO 2.8.2 | data |socketiIO-client 0.7.2|
| | <------------------------+ | | <--------------------+ | |
| | | | | |
+-----------------+ +----------------------+ +----------------------+
如果适合您,您可以将第二个回调留在服务器端,或者更少,您也可以用事件替换它。