Redux Observables:具有多个事件的自定义观察者?

时间:2017-03-22 14:46:02

标签: react-native rxjs phoenix-framework redux-observable

您好我正在尝试使用带有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);
      }
    });
};

如您所见,此方法存在一些问题:

  1. 一名观察员正在发射不同的事件。除了.map()函数

  2. 中的switch语句之外,我不知道如何拆分它们
  3. 我不知道在哪里拨打observer.complete(),因为我希望它继续听取所有这些事件,而不只是一次。

  4. 如果我可以将channel常量提取到一个单独的文件中,该文件可用于修复这些问题的几个史诗。但是,channel取决于socketuser取决于channel,它来自redux状态。

  5. 所以我对如何解决这个问题感到很困惑。我认为提取全局Rx.Subject对象的能力会修复它,但这也取决于redux状态的用户ID。任何帮助表示赞赏。

    P.S。如果它有价值,我的用例与这个人(https://github.com/MichalZalecki/connect-rxjs-to-react/issues/1)非常相似。其中一位回复者建议使用setInterval,但我不知道从哪开始......

1 个答案:

答案 0 :(得分:1)

好像你的生活更加困难。您已经映射了事件,那么为什么要组合并重新映射它们?将每个事件映射到自己的流中,并将结果合并在一起。

$index