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.