Как использовать сагу без редукса?

Одна из моих главных причин использования redux-saga заключается в том, насколько тестируемым он выполняет асинхронные вызовы функций. Моя дилемма в том, что, когда я программирую с объектами с состоянием, которые не принадлежат моему магазину с избыточностью, это становится довольно неловким программированием с помощью саг. Есть ли лучшая практика для работы с объектами не чистых данных и redux-сагой?

Скажем, у меня есть функции обратного вызова, которые я регистрирую с помощью API, в данном случае - firebase, и мне нужно сохранить эти функции обратного вызова, чтобы я мог отменить их регистрацию позже. Я не могу хранить эти функции обратного вызова в избыточном, так что имеет ли смысл писать это как сагу?

Кажется немного странным в одном фрагменте кода, чтобы иметь возможность использовать такие вещи, как положить, выбрать и в других фрагментах кода, я должен использовать store.dispatch.

Пример:

  const childAddedTrigger = (dataSnapshot: firebase.database.DataSnapshot) => {
    const message = Object.assign({}, dataSnapshot.val(), {
      key: dataSnapshot.key,
    });
    service.store.dispatch(Actions.channelMessageAdded(channelId, message));
  }    

  service.firebase.database().ref(`channels/${channelId}/messages`)
    .limitToLast(20)
    .on('child_added', childAddedTrigger);

  this.channelSubscriptions[channelId] = childAddedTrigger;

1 ответ

Решение

Вы хотели бы использовать концепцию каналов Channel-саги.

Эффект как take, call, put что делает асинхронные функции настолько простыми для тестирования с помощью redux-saga. По умолчанию они взаимодействуют с хранилищем redux, потому что библиотека - это, прежде всего, промежуточное программное обеспечение redux.

Тем не менее eventChannel Функция фабрики позволяет вам брать внешние источники событий, скажем, из веб-сокета или базы данных и извлекать из них события, а не выполнять действия, отправленные из хранилища, и "помещать" события в них, а не в хранилище с избыточностью.

Вы хотите runSaga. Это функция для запуска любой саги, предоставляя все необходимое для работы саги в качестве аргументов.

Как заявляет @TheBrofessor, поскольку redux-saga работает, взаимодействуя с некоторыми входами и выходами, если вы можете определить такие входные и выходные данные, их можно запустить в redux-saga. Вchannel вариант и dispatchoption отвечает за ввод и вывод саги. См. Документацию для подробного объяснения.

Следует отметить одну вещь, которая не задокументирована в документации, - это поведение stdChannel. Фактически, канал, описанный в документе Channel, ведет себя как очередь. Где как поведениеstdChannel это скорее подписка / отправка (как и "каналы" в любой другой структуре подписки).

Потому что stdChannel- это специальный канал, который работает как канал подписки. Фактически, когда redux-saga подключается к redux store, он помещает все события отправки магазина вstdChannel, поэтому каждая сага takeing all может получить отправленное событие.

Вы можете подтвердить, что redux-saga действительно определяет понятие multicast в их исходном коде, который реализован наstdChannel.

Другие вопросы по тегам