Nano Hash - криптовалюты, майнинг, программирование

Отмена канала события React Redux Saga

Есть ли какой-либо способ с помощью чего-то вроде побочного эффекта в 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 () для самой ссылки на канал?

Спасибо за любую помощь, которую вы можете оказать.

26.09.2017

Ответы:


1

Вы имеете в виду это?

function* sync() {
  const channel = yield call(todosChannel);

  yield takeEvery(channel, function*({value}){
    yield put(actions.syncTodos(value))
  }

  yield take('CANCEL_WATCH')
  channel.close();
}

Кстати, takeEvery - это помощник, а не эффект.

29.09.2017
  • Это действительно чисто, спасибо! Если бы я хотел условно выполнить создание канала, я мог бы просто поставить yield take('SOME_ACITON') перед yield call(todosChannel)? 29.09.2017
  • to alex: да, take - это блокирующий эффект. 14.10.2017
  • Застрял yucky while(true) на всю жизнь, пока не увидел это. 23.05.2019

  • 2

    Мне пришлось немного изменить принятый подход к ответам, чтобы улавливать ошибки, возникающие в моем канале. Я также предпочитаю обрабатывать отмену в вилке, а не обрабатывать значения, как в принятом ответе.

    function* sync() {
      const channel = yield call(todosChannel);
    
      yield fork(function* () {
        yield take('CANCEL_WATCH')
        channel.close();
      })
    
      try {
        while (true) {
          const { value } = yield take(channel)
          yield put(actions.syncTodos(value))
        }
      }
      catch (error) {
        yield put(actions.cancelWatch()) // to emit 'CANCEL_WATCH'
        yield put(actions.errorTodos(error))
      }
    }
    
    16.02.2019
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..