嗨,我正在尝试将 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
,哪个是依赖于user
,来自于redux状态。
所以我对如何解决这个问题感到很困惑。我认为提取全局channel
对象的能力可以解决它,但这也取决于来自 redux 状态的用户 ID。任何帮助表示赞赏。
PS 如果值得的话,我的用例与这个人非常相似(https://github.com/MichalZalecki/connect-rxjs-to-react/issues/1)。其中一位响应者建议使用Rx.Subject
,但我不知道从哪里开始......