Как правильно связать FireBase с Редукс-Сагами? - PullRequest
0 голосов
/ 03 июня 2018

Я создаю собственное приложение, где я использую react-native-firebase и redux-saga.Это мой первый проект, использующий redux-saga, поэтому я учусь.До сих пор я получал аутентификацию пользователя, используя следующее:

import firebase from 'react-native-firebase';

function* loginEmlPwdSaga(action) {
  try {
    const auth = firebase.auth();
    const data = yield call(
      [auth, auth.signInAndRetrieveDataWithEmailAndPassword],
      action.email,
      action.password,
    );
    yield put(loginSuccess(data));
  } catch (error) {
    yield put(loginFail(error));
  }
}

Однако теперь я застрял в точке, где я хочу подписаться на коллекцию.В react-native-firebase я бы использовал следующее:

firebase.firestore().collection('users').onSnapshot(...)

Я не уверен, каков наилучший подход к обработке подписок в redux-saga.Можете ли вы показать мне шаблон, который я могу использовать для будущего использования onSnapshots (тестируемый)?

1 Ответ

0 голосов
/ 11 июня 2018

Самый простой способ подписаться на коллекцию пожарных хранилищ с использованием redux-saga - это использовать канал:

function * syncUsers () {
  const ref = app.firestore().collection('users')
  const channel = eventChannel(emit => ref.onSnapshot(emit))

  try {
    while (true) {
      const data = yield take(channel)
      yield put(successAction(data))
    }
  } catch (err) {
    yield put(errorAction(err))
  }
}

Это будет отправлять действие (созданное successAction(data)) каждый раз, когда база данных пожарных отправляет изменениесвоему клиенту.

Вы также можете использовать библиотеку, такую ​​как redux-saga-firebase , чтобы автоматизировать эту часть и просто использовать:

function * syncUsers () {
  yield fork(rsf.firestore.syncCollection, 'users', {
    successActionCreator: successAction,
    failureActionCreator: errorAction
  })
}

Отказ от ответственности:Я автор redux-saga-firebase .

...