如何设计redux-saga和socket-io动作?

时间:2018-06-18 12:56:15

标签: reactjs redux socket.io redux-saga

我正在使用react-nativesocket.io开发和redux-saga应用。
使用this示例,
我创建了一个从套接字中收听消息的传奇 并发出一个动作。

现在我想知道如何写另一面,
收听dispatch个活动,并emit收听socket 在示例中,他仅为write个事件使用了一条消息,因此它很简单。

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

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事件?

1 个答案:

答案 0 :(得分:0)

如果我正确理解您的问题,您希望修改示例以使用比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 }}))

或者,如果您只想区分极少数类型的事件名称,那么有一个明确的写法传闻是有道理的:

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);
  }
}