您好我正在尝试使用带有react native的redux-observables和一个名为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()
函数
我不知道在哪里拨打observer.complete()
,因为我希望它继续听取所有这些事件,而不只是一次。
如果我可以将channel
常量提取到一个单独的文件中,该文件可用于修复这些问题的几个史诗。但是,channel
取决于socket
,user
取决于channel
,它来自redux状态。
所以我对如何解决这个问题感到很困惑。我认为提取全局Rx.Subject
对象的能力会修复它,但这也取决于redux状态的用户ID。任何帮助表示赞赏。
P.S。如果它有价值,我的用例与这个人(https://github.com/MichalZalecki/connect-rxjs-to-react/issues/1)非常相似。其中一位回复者建议使用setInterval
,但我不知道从哪开始......
答案 0 :(得分:1)
好像你的生活更加困难。您已经映射了事件,那么为什么要组合并重新映射它们?将每个事件映射到自己的流中,并将结果合并在一起。
$index