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.