javascript - Redux-thunk với Websockets
Tôi muốn tạo một websocket theo yêu cầu khi một số thành phần muốn đăng ký dữ liệu. Làm thế nào để tôi chia sẻ instance websocket theo cách của redux?
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))
}
}
}
Tôi có thể làm điều gì đó như thế này, nhưng điều này sẽ yêu cầu một thể hiện mới cho mỗi đăng ký mới.
Câu trả lời #1
Nơi chuẩn để đặt những thứ như các đối tượng kết nối bền vững là bên trong middleware. Và thực tế, có hàng chục middleware tồn tại đã minh họa cho cách tiếp cận đó, với hầu hết trong số chúng được liệt kê tại https://github.com/markerikson/redux-ecosystem-links/blob/master/middleware.md#sockets-and-adapters. Bạn nên có thể sử dụng một số trong số đó trực tiếp, hoặc ít nhất là làm ví dụ.
Câu trả lời #2
Bạn có thể xem redux-websocket-bridge. Nó giải nén các tin nhắn Web Socket thành các action của Redux, và chuyển tiếp các action của Redux tới Web Socket.
Lợi ích của phương pháp này: bạn có thể sử dụng Redux trên máy chủ của mình như một điểm cuối API, thay thế REST API tiêu chuẩn với ít mã hơn.
Ngoài ra, nếu server của bạn không gửi Flux Standard Action, bạn vẫn có thể sử dụng redux-websocket-bridge cho các tin nhắn thô. Nó hoạt động với string, ArrayBuffer, và Blob. Tất nhiên, bạn luôn có thể viết một middleware nhỏ để chuyển đổi chúng thành Flux Standard Action, ví dụ như các tin nhắn từ Slack RTM API.