【问题标题】:How to design redux-saga and socket-io actions?如何设计 redux-saga 和 socket-io 动作?
【发布时间】:2018-06-18 12:56:15
【问题描述】:

我正在使用socket.ioredux-saga 开发和react-native 应用程序。
使用this 示例,
我创建了 saga 来监听来自套接字的消息
并发出一个动作。

现在我想知道如何写另一面,
收听dispatch 事件和emit 他们到socket
在示例中,他只为 write 事件使用了 1 条消息,所以这很简单。

我不希望我的代码看起来像这样:

yield fork(writeEvent1, socket)
yield fork(writeEvent2, socket)
yield fork(writeEvent3, socket)

...

function * writeEvent1 (socket) {
  while (true) {
    yield take(Actions.EVENT_1)
    socket.emit('event-1')
  }
}

function * writeEvent2 (socket{
  ...
}

如何以可读的方式管理这个write 事件?

【问题讨论】:

    标签: reactjs redux socket.io redux-saga


    【解决方案1】:

    如果我正确理解您的问题,您希望修改示例以使用更多事件名称,而不仅仅是 message。处理这个问题真的取决于你的用例。如果您想为每条消息使用不同的事件名称,您只需修改 write saga 以具有可变事件名称,如下所示:

    function* write(socket) {
      while (true) {
        const { eventName, payload } = yield take(SEND_MESSAGE);
        socket.emit(eventName, payload);
      }
    }
    ...
    yield put(sendMessage({eventName: 'foo', payload: { bar: 'baz'}}))
    

    如果您的事件名称列表有限,您仍然可以使用上面的示例,但可能使用某种 const 枚举,例如:

    const eventNames = {
        FETCH_USER: 'fetch-user',
        FETCH_ITEM: 'fetch-item',
        FETCH_POST: 'fetch-post',
    }
    ...
    yield put(sendMessage({eventName: eventNames.FETCH_USER, payload: { id: 123 }}))
    

    或者,如果您只想区分极少数类型的事件名称,那么有一个明确的 write sagas 是有意义的,例如:

    function* write(socket) {
      while (true) {
        const { payload } = yield take(SEND_MESSAGE);
        socket.emit('message', payload);
      }
    }
    
    function* writeError(socket) {
      while (true) {
        const { payload } = yield take(SEND_ERROR);
        socket.emit('error', payload);
      }
    }
    

    【讨论】:

    • 至于您的第一个建议,如果我走这条路,我将不得不修改reducers,以便他们必须执行某种switch-case 来选择正确的事件。现在我有一个事件名称和相应的减速器的地图,非常舒服(我正在使用这个样板github.com/infinitered/ignite-ir-boilerplate-andross
    • 因此您希望基于一个已调度的 actione 通过 reducer 更新 redux 状态并通过 websockets 发出消息。两者都使用相同的有效载荷?
    • 我想知道 redux-saga 可能有一些解决方案,比如订阅示例
    猜你喜欢
    • 2021-07-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多