【发布时间】:2016-05-23 21:49:27
【问题描述】:
上下文
我们正在构建一个基于 Flux 的 Web 应用程序,其中客户端(Flux/React/TypeScript)通过 websockets(而不是通过 HTTP GET)与服务器 (C#) 通信。
当执行客户端操作时,我们通过 Web 套接字连接向服务器发送命令请求。
服务器总是快速响应第一个 Start 响应(指示它是否可以执行请求的操作),然后响应 1 个或多个 Progress 响应(可能是数百个响应,其中包含有关已执行操作的进度信息)。当服务器上的操作完成时,最后一个 Progress 响应将具有 100% 的进度分数和“OK”错误状态。
请注意,一些服务器操作可能只需要 100 毫秒,但其他可能需要长达 10 分钟(因此会有进度响应,因此客户端可以向用户显示有关操作的一些信息)。
在客户端,我们有:
- 我们调用的 sendCommandRequest 函数通过 websocket 向服务器发送命令请求
- 一个处理函数handleCommandResponse(在websocket onMessage回调中调用)
我们的问题是:将服务器通信注入基于 Flux 的应用程序的最佳方式是什么?我们应该在哪里对 websocket 进行 send 调用,我们应该如何从 websocket 的回调返回 Flux 链?
提案
假设我们更改了客户端 GUI 中的视觉效果参数(浮点数,在文本字段框中设置),这会触发服务器上生成新图像的操作。此操作需要 1 秒才能在服务器上执行。
现在,情况是这样的,GUI 处理程序将向调度程序发送一个 Flux 动作,调度程序调用向其注册的商店的回调,然后商店根据动作有效负载更新其数据,并且通过更改事件回调触发各种组件,这些回调使用 setState 和新的商店数据来触发重新渲染。
我们可以让商店在他们更改数据(如新参数值)时通过 websocket 向服务器发送命令请求。此时,存储将具有新的参数值,而图像仍然是最后接收到的图像(来自上一个命令)。
从那一刻起,服务器开始向客户端发回 Progress 响应,这些响应到达 websocket onMessage 回调,最终的 Progress 响应将包含新图像(2 秒后)。
在 websocket onMessage 回调中,我们现在可以向调度程序发送第二个 Flux 操作,将新接收到的图像作为有效负载,这将导致商店使用新图像更新其数据,这将导致监听组件重新渲染。
这个问题是:
- Flux 存储可以有部分更新的数据:只要服务器没有发回最终结果,存储就会有新的参数,但仍然是旧图像
- 我们现在需要 2 个 Flux 操作:一个由 GUI 用来表示用户进行了一些更改,另一个由 Web 套接字回调用来表示某些结果到达
- 如果服务器端出现问题,新参数已经在 Flux 存储中设置,而我们将永远不会收到新图像,因此存储中的数据会损坏
在 Flux 工作流程中是否有更好的方法来适应服务器通信? 有什么建议/最佳做法吗?
【问题讨论】:
标签: reactjs websocket client-server flux