javascript - Redux-thunk s Websockets


Chcem vytvoriť websocket na požiadanie, keď určité komponenty chcú odoberať dáta. Ako môžem zdieľať inštanciu websocketu spôsobom podobným Reduxu?

action.js

export function subscribeToWS(url) {
   return dispatch => {
      let websocket = new WebSocket(url)
      websocket.on('connect', () => {
         websocket.send("subscribe") 
      }
      websocket.on('message', (message) => {
        dispatch(storeNewData(message))
      }
   } 
}

Mohol by som urobiť niečo takéto, ale to by vyžadovalo novú inštanciu pre každé nové predplatné.

Odpoveď č. 1

Štandardné miesto na uloženie vecí, ako sú objekty pretrvávajúceho pripojenia, je vo vnútri middleware. A v skutočnosti existujú doslova desiatky existujúcich middleware, ktoré demonštrujú tento prístup, pričom väčšina z nich je uvedená na https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware.md#sockets-and-adapters. Mali by ste byť schopní použiť niektoré z nich priamo, alebo aspoň ako príklady.

Odpoveď č. 2

Môžete sa pozrieť na redux-websocket-bridge. Rozvinie správy Web Socket do Redux akcií a prenesie Redux akcie do Web Socket.

Výhoda tohto prístupu: môžete použiť Redux na svojom serveri ako API endpoint, čím nahradíte štandardné REST API s menším množstvom kódu.

Tiež, ak váš server neposiela Flux Standard Action, stále môžete použiť redux-websocket-bridge pre surové správy. Funguje s string, ArrayBuffer a Blob. Samozrejme, vždy si môžete napísať malý middleware na preklad týchto správ do Flux Standard Action, napr. správy z Slack RTM API.