Есть ли какой-либо способ с помощью чего-то вроде побочного эффекта в Redux Saga отменить eventChannel?
Учитывая eventChannel
подключение к внешнему событию / потоку данных, в данном случае событие "child_added"
базы данных Firebase в реальном времени:
// action
const types = { SYNC: 'SYNC_TODOS' };
function syncTodos(todos) {
return { types: types.SYNC, todos }
}
// saga
function todosChannel() {
// firebase database ref
const ref = firebase.database().ref('todos/');
const channel = eventChannel(emit => {
const callback = ref.on('child_added', (data) => {
emit({ snapshot: data, value: data.val() })
});
// unsubscribe function
return () => ref.off('child_added', callback);
});
return channel;
}
function* sync() {
const channel = yield call(todosChannel);
try {
while (true) {
const { value } = yield take(todosChannel);
yield put(actions.syncTodos(value));
}
}
finally {
if(yield cancelled()) {
channel.close();
}
}
}
export default function* rootSaga() {
yield fork(sync);
}
Есть ли способ использовать эффективную сторону, такую как fork (), с чем-то вроде takeEvery () для прослушивания действия по отмене канала событий и прекращения прослушивания потока событий / данных Firebase "child_added"
? Или для этого нужно как-то сохранить ссылку на канал и выполнить cancel () для самой ссылки на канал?
Спасибо за любую помощь, которую вы можете оказать.
yield take('SOME_ACITON')
передyield call(todosChannel)
? 29.09.2017take
- это блокирующий эффект. 14.10.2017while(true)
на всю жизнь, пока не увидел это. 23.05.2019