Vyhledávání na webu

javascript - Redux-thunk s Websockets


Chci vytvořit websocket na vyžádání, když se určité komponenty chtějí přihlásit k odběru dat. Jak mohu sdílet instanci websocketu ve stylu 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))
      }
   } 
}

Mohl bych udělat něco takového, ale to by vyžadovalo novou instanci pro každé nové předplatné.

Odpověď č. 1

Standardní místo pro ukládání věcí, jako jsou objekty trvalého připojení, je uvnitř middleware. A ve skutečnosti existují doslova desítky existujících middleware, které tento přístup demonstrují, přičemž většina z nich je uvedena na https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware.md#sockets-and-adapters. Měli byste být schopni některé z nich použít tak, jak jsou, nebo alespoň jako příklady.

Odpověď č. 2

Můžete se podívat na redux-websocket-bridge. Rozvádí zprávy Web Socket do akcí Redux a přenáší akce Redux do Web Socket.

Výhoda tohoto přístupu: můžete používat Redux na svém serveru jako API endpoint, nahrazující standardní REST API s menším množstvím kódu.

Také, pokud váš server neposílá Flux Standard Action, stále můžete použít redux-websocket-bridge pro neformátované zprávy. Funguje s string, ArrayBuffer a Blob. Samozřejmě, vždy můžete napsat malý middleware, který je přeloží do Flux Standard Action, například zprávy z Slack RTM API.