2017-04-05 12 views
7

Używam kanału zdarzeń sx sx. Mam konkretny przypadek użycia, w którym chcę uzyskać stan StoreStore, gdy zdarzenie zostanie wywołane, ponieważ eventChannel nie jest funkcją generatora i nie mogę użyć efektu select sagas redux. Każdy inny sposób, aby to osiągnąć?Użyj efektu wyboru w normalnej funkcji/zdarzeniach Kanały

Próbowałem również importować sklep i używać store.getState(), ale jestem coraz niezdefiniowany, ponieważ plik sagi jest importowany przed inicjalizacją sklepu.

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

Rozwiązanie prawdopodobnie będzie polegało na przeniesieniu pewnej logiki z funkcji EventEmitter do sagi podejmującej jej działania. Czy możesz udostępnić jakiś kod, abyśmy mogli zobaczyć, co robi wydarzenie Event/saga podejmujące swoje wydarzenia? – VonD

+0

Mój przypadek użycia to Potrzebuję pobrać najnowszą nieprzeczytaną wiadomość, gdy połączenie zostanie przywrócone, ponieważ potrzebuję uzyskać znacznik czasu dla otrzymanej ostatniej wiadomości, która jest w magazynie, więc polecenie będzie do wysłać odData tj. Znacznik czasu ostatniej wiadomości i do daty, że jest currentDate –

Odpowiedz

1

Jednym z możliwych rozwiązań byłoby użycie funkcji kanału redux-saga. Ideą byłoby wypchnięcie zdarzenia do kanału za każdym razem, gdy wystąpi zdarzenie gniazda. W tym samym czasie masz inną sagę, która słucha wydarzeń na kanale i odpowiednio reaguje. Ponieważ część odsłuchowa jest sagą, możesz używać typowych efektów sagi, takich jak select.

Kod prawdopodobnie mógłby wyglądać następująco:

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) 
     ... 
    } 
    } 
} 

Mam nadzieję, że to pomoże.

Powiązane problemy