2017-04-05 1 views
7

私はredux sagasイベントチャネルを使用しています。私はeventChannelがジェネレータ関数ではないためイベントがトリガされるときにgetStore状態にしたい特定のユースケースを持っています。私はreduxサガの選択効果を使用できません。これを達成するための他の方法は?通常の機能/イベントチャネルで選択効果を使用

私もストアをインポートしようとしましたが、store.getState()を使用しましたが、ストアが初期化される前にsagaファイルがインポートされるため、私は定義されていません。

function subscribe(socket) { 
    return eventChannel(emit => { 
     socket.subscribe(listenerTopic, {qos: 1}); 
     socket.on('reconnection',() => { 
      // i need to fetch latest unread message, for that i need to get timestamp 
      // for last message received which is in store so the command will be to 
     // send sinceDate i.e last message timestamp and untilDate that is currentDate 
    }) 
} 
+0

解決策には、eventEmitter関数からそのアクションを実行するサガにいくらかのロジックを移動することが含まれます。あなたはイベントを取っているイベント/イベントが何をしているのかを見ることができるようにいくつかのコードを共有できますか? – VonD

+0

私のユースケースは です。接続が回復したときに最新の未読メッセージを取得する必要があります。タイムスタンプを取得する必要があります。最後のメッセージが受信されたので、 に送信されます。現在の日付です –

答えて

1

可能な解決策の1つは、redux-sagaチャネル機能を使用することです。 アイデアは、ソケットイベントが発生するたびにイベントをチャネルにプッシュすることです。同時に、チャネル上のイベントをリスニングする別のサガがあり、それに応じて反応します。リスニングパートはサガであるため、selectのような共通のサガ効果を使用できます。

あなたのコードは、おそらく次のようになります。

import { channel } from 'redux-saga' 
import { select } from 'redux-saga/effects' 

const socketChannel = channel() 

function subscribe(socket) { 
    return eventChannel(emit => { 
    socket.on('reconnection',() => { 
     socketChannel.put({ type: RECONNECTION }) 
    }) 
    }) 
} 

export function* watchSocketChannel() { 
    while (true) { 
    const action = yield take(socketChannel) 

    if (action.type === RECONNECTION) { 
     const lastMessageTimestamp = yield select(selectors.getLastMessageTimestamp) 
     ... 
    } 
    } 
} 

私は、これはあなたを助けることを願っています。

関連する問題