reactjs - Flask socketIO 发出一系列事件
问题描述
我希望服务器在建立连接后向客户端(React)发出一系列事件,我试过:
@socketio.on('connect')
def test_connect():
for i in range(10):
emit('my response', {'data': 'Connected ' + str(i)})
time_module.sleep(2)
但是事件同时显示在 Web 浏览器控制台中,就像它们同时到达一样,在我使用的反应中:
useEffect(() => {
const socket = socketIOClient(ENDPOINT);
socket.on('my response', function (data) {
console.log('my response: ', data.data);
})
})
解决方案
您的服务器代码中有两个潜在问题。
首先,time_module
你的例子是什么?我怀疑这是你正在做的阻塞睡眠。相反,我建议你用socketio.sleep(2)
.
第二个问题是您在connect
事件处理程序中执行此操作。Socket.IO 服务器会一直等待,直到您从连接处理程序返回来决定客户端是被接受还是被拒绝,因此通常您不希望此处理程序花费很长时间来运行,因为连接尚未完全建立,直到您返回。我建议您将此逻辑移至后台功能。
以下代码解决了这两个问题:
def initial_events():
for i in range(10):
emit('my response', {'data': 'Connected ' + str(i)})
socketio.sleep(2)
@socketio.on('connect')
def test_connect():
socketio.start_background_task(initial_events)
推荐阅读
- ruby-on-rails - Rail 的 end_of_month() 方法总是返回 30 作为最后日期
- .net - 更改 ClickOnce 以将新安装 url 与其他 PublicKeyToken 一起使用
- vb.net - 如何在 DataGridView 中的行之间绘制垂直线?
- flutter - 如何将小部件自己的数据传递给函数
- python-3.x - 在 Python 中创建服务包装器
- testng - 如何使用同一 Testng 类中定义的 1 个数据提供程序并行运行单个 @Test 方法
- javascript - 如何有条件地增加值?
- java - 将值映射到实体中缺少的 DTO
- terraform - 无法对我的 terraform 模块设置条件
- swift - 由于未声明的类型,如何将代码转换为 Swift 4?