0

我使用样板和传奇实现 websocket 的方法应该是什么,我想在应用程序启动期间连接 websocket,并在连接断开时重新连接。

我正在考虑使用 fork 进行发送和接收,但我仍然应该使用 actionChannel 吗?

我需要在连接断开时取消分叉的发送和接收线程,并在连接恢复时重新生成。

一些一般性问题:(与 react/redux-saga 无关)

当我的应用程序想要在断开连接状态下发送消息时,我应该采取什么方法?我也应该有请求响应,我在数据中发送请求号,服务器回复我,我应该如何处理?

4

1 回答 1

0

在实践中,有几种策略可用于在 redux 基础架构中打开 socket.io:

首先,有中间件形式的现成决策,例如https://www.npmjs.com/package/redux-socket.io

其次,可以做的更简单更狡猾。在创建 redux store 和 saga 的同时,还可以创建必要的 socket.io 客户端实例,以及功能闭包的逻辑。

以下示例完全涵盖了您的情况。只需MESSAGES_MAP使用应该映射到 Redux 操作的事件名称设置映射。

import React from 'react';
import { render } from 'react-dom';
import { Provider } from 'react-redux';
import { createStore, applyMiddleware, compose } from 'redux';
import socketIO from 'socket.io-client';
import YourRootContainter from './YourRootContainter';

const MESSAGES_MAP = {
    'MESSAGE_1': 'REDUX_ACTION_1',
    'MESSAGE_2': 'REDUX_ACTION_2'
};

Promise.resolve(createSagaMiddleware()).then(saga => ({
    store: (compose(applyMiddleware(saga))(createStore))(
        YOUR_REDUCER,
        YOUR_INITIAL_STATE
    ),
    socketClient: socketIO(YOUR_SOCKET_URL, {
        path: YOUR_EXCHANGE_URL_PATH
    }),
    saga
})).then(({ saga, store, socketClient }) => (
    Object.keys(MESSAGES_MAP).forEach(name => (
        socketClient.on(name, event => store.dispatch({
            type: MESSAGES_MAP[name],
            payload: { ...event }
        }))
    )), 
    saga.run(YOUR_SAGA_ENTRY_POINT),
    store
)).then(store => render(
    (<Provider store={store}>
        <YourRootContainter />
    </Provider>), 
    document.getElementById('root')
));
于 2017-04-18T09:41:27.093 回答