2017-04-02 13 views
-2

boilerplate와 saga를 사용하여 websocket을 구현하는 방법은 무엇입니까? 응용 프로그램을 시작하는 동안 websocket에 연결하고 연결이 끊어지면 다시 연결하고 싶습니다.redux-saga에서 websocket을 어떻게 구현해야합니까?

송수신에 fork를 사용하는 것이 좋지만 여전히 actionChannel을 사용해야합니까?

연결이 끊어 지거나 다시 연결될 때 포크 된 샌드 및 수신 스레드를 취소해야합니다.

몇 가지 일반적인 질문 : 내 응용 프로그램은 연결이 끊긴 상태에서 메시지를 보내려고 내 접근해야한다 무엇

(/ REDUX-사가 반응과 관련이없는)? 해야합니까 또한 요청 - 응답을 어디에 내가 요청 번호를 보내고 서버가 나를 다시 응답, 어떻게 처리해야합니까? 실제로

+0

Welcome to Stackoverflow! 여기에서 훌륭한 답변을 얻을 수 있지만 지금까지 시도한 내용에 대해 더 자세히 알려주십시오. 무엇보다 중요한 것은 여기에 몇 개의 코드를 링크 (가급적이면 바이올린/빈/펜)로 연결하는 것입니다. – Alp

답변

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