从服务器订阅事件流

Subscribe to a stream of events from server

我正在扩展 redux-observable 的 ping-pong 示例,我的最终目标是 对从服务器 接收到的每个事件调度一个动作。

但我在思考如何真正实现这一点时遇到了一些麻烦。

我目前拥有的:

1.Upon 打开连接我的服务器开始发送消息。

// server.js
setInterval(()=>{
    ws.send(JSON.stringify({
        type: 'INCREMENT',
        status: 200
    }))
    console.log("sent some data")
},3000)

2。在客户端我已经建立了一个 Websocket 连接的 Observable。

const socket$ = Observable.webSocket("ws://localhost:8081")

其余代码与JSBin Example for react

类似

如何为这个任务创建史诗?我如何发送一个动作?

我们在评论中讨论了一些,但恐怕我仍然不完全清楚 increment/counter/INCREMENT_APPLY 与套接字的关系,但我可以给你一个简单的例子:

const somethingEpic = action$ =>
  action$.ofType('START_SOCKET_OR_WHATEVER')
    .switchMap(action =>
      Observable.webSocket('ws://localhost:8081')
        .map(response => ({ type: 'RECEIVED_MESSAGE', paylod: response }))
    );

在这里,当 START_SOCKET_OR_WHATEVER 被调度时,我们将开始监听我们的套接字。每当收到一条消息时,我们都会将其映射到一个 RECEIVED_MESSAGE 动作中,该动作将在 epic 发出它之后进行分派。

您会注意到这与您执行单个 ajax 的方式几乎相同。如果您需要将消息发送到服务器或多路复用,它只会变得明显不同。