【发布时间】:2017-03-22 14:46:02
【问题描述】:
您好,我正在尝试将 redux-observables 与 react native 和一个名为 Phoenix 的 websocket 包装器一起使用,它基本上允许您在通过 websocket 接收到某些消息时执行回调。
这是我正在尝试做的基本设置:
import 'rxjs';
import { Observable } from 'rxjs';
import { Socket, Channel } from 'phoenix';
import * as channelActions from '../ducks/channel';
export default function connectSocket(action$, store) {
return action$.ofType(channelActions.SETUP)
.mergeMap(action => {
return new Observable(observer => {
const socket = new Socket('http://localhost:4000/socket');
const userId = store.getState().user.id;
const channel = socket.channel(`user:${userId}`);
channel
.join()
.receive('ok', response => observer.next({ type: 'join', payload: 'something' }))
.receive('error', reason => observer.next({ type: 'error', payload: 'reason' }))
channel.on('rooms:add', room => observer.next({ type: 'rooms:add', payload: '123' }))
channel.on('something:else', room => observer.next({ type: 'something:else', payload: '123' }))
});
})
.map(action => {
switch (action.type) {
case 'join':
return channelActions.join(action.payload);
case 'error':
return channelActions.error(action.payload);
case 'rooms:add':
return channelActions.add(action.payload);
case 'something:else':
return channelActions.something(action.payload);
}
});
};
如您所见,这种方法存在几个问题/问题:
一个观察者正在触发不同的事件。除了
.map()函数中的 switch 语句之外,我不知道如何拆分它们我不知道在哪里打电话给
observer.complete(),因为我希望它继续侦听所有这些事件,而不仅仅是一次。如果我可以将
channel常量提取到一个单独的文件中,该文件可用于几个可以解决这些问题的史诗。但是channel依赖于socket,而socket又依赖于来自redux状态的user。
所以我很困惑如何解决这个问题。我认为提取全局 channel 对象的能力可以修复它,但这也取决于 redux 状态中的用户 ID。任何帮助表示赞赏。
附:如果值得的话,我的用例与这个人 (https://github.com/MichalZalecki/connect-rxjs-to-react/issues/1) 非常相似。其中一位响应者建议使用Rx.Subject,但我不知道从哪里开始...
【问题讨论】:
-
与rxjs更相关,考虑加rxjs、rx标签
标签: react-native rxjs phoenix-framework redux-observable