0

こんにちは、反応ネイティブとフェニックスと呼ばれる websocket ラッパーで redux-observables を使用しようとしています。これにより、基本的に、特定のメッセージが 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. 1 つのオブザーバーからさまざまなイベントが発生しています。.map()関数内の switch ステートメント以外にそれらを分割する方法がわかりません

  2. observer.complete()一度だけではなく、これらすべてのイベントを引き続きリッスンしたいので、どこに電話すればよいかわかりません。

  3. channelこれらの問題を解決するいくつかの叙事詩で利用可能な別のファイルに定数を抽出できれば. ただし、channelは、還元状態に由来する にsocket依存しています。user

したがって、この問題にどのようにアプローチするかについて、私はかなり混乱しています。グローバルオブジェクトを抽出する機能で修正されると思いますchannelが、それは還元状態からのユーザー ID にも依存します。どんな助けでも大歓迎です。

PS何かの価値がある場合、私のユースケースはこの男と非常に似ています( https://github.com/MichalZalecki/connect-rxjs-to-react/issues/1 )。レスポンダーの1人が使用を推奨しRx.Subjectましたが、どこから始めればよいかわかりません...

4

1 に答える 1