2017-04-02 118 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') 
)); 
相關問題