Как использовать сагу без редукса?
Одна из моих главных причин использования 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
вариант и dispatch
option отвечает за ввод и вывод саги. См. Документацию для подробного объяснения.
Следует отметить одну вещь, которая не задокументирована в документации, - это поведение stdChannel
. Фактически, канал, описанный в документе Channel, ведет себя как очередь. Где как поведениеstdChannel
это скорее подписка / отправка (как и "каналы" в любой другой структуре подписки).
Потому что stdChannel
- это специальный канал, который работает как канал подписки. Фактически, когда redux-saga подключается к redux store, он помещает все события отправки магазина вstdChannel
, поэтому каждая сага take
ing all может получить отправленное событие.
Вы можете подтвердить, что redux-saga действительно определяет понятие multicast
в их исходном коде, который реализован наstdChannel
.