2017-04-02 117 views
-2

我应该如何使用样板和传奇来实现websocket,我想在应用程序启动时连接websocket,并在连接断开时重新连接。我应该如何在redux-saga中实现websocket?

我想用fork来发送和接收,但仍然应该使用actionChannel?

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

一些一般性的问题:(不涉及反应/终极版 - 传奇)

应该是什么时,我的应用程序要断开状态时发送消息我的做法?我是否应该 另外我有请求 - 响应,我在数据和服务器中发送请求编号,我应该如何处理?

+0

欢迎来到Stackoverflow!你会在这里得到很好的答案,但请提供一些更多的信息,你到目前为止尝试过。最重要的是,链接这里的一些代码(最好是一个小提琴/ bin/pen)。 – Alp

回答

0

在实践中有几个策略,可用于在终极版基础上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') 
)); 
相关问题