redux-saga: eventChannel и слушатель, которые реагируют на обратный вызов - PullRequest
0 голосов
/ 25 декабря 2018

В реагирующе-родном обработчике задним числом слушатель реагирует на функцию обратного вызова и действует соответствующим образом.

Мне нужно прочитать мой магазин и в зависимости от него вернуть true или false.Но я не могу использовать эффект выбора в обычной функции и не могу влиять на функцию обратного вызова слушателя из функции «watchBackButton».

export function* backButtonListen() {
  return eventChannel(emitter => {
    const backHandlerListener = BackHandler.addEventListener(
      "hardwareBackPress",
      () => {
        emitter("back pressed");
      }
    );
    return () => {
      backHandlerListener.remove();
    };
  });
}

export function* watchBackButton() {
  const chan = yield call(backButtonListen);
  try {
    while (true) {
      let back = yield take(chan);
    }
}

1 Ответ

0 голосов
/ 26 декабря 2018

Поскольку каналы событий не являются двунаправленными, я не думаю, что есть способ получить какое-то текущее состояние из саги в канал событий, используя эффект select.

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

Используя, например, метод контекста, вы можете сделать что-то вроде этого:

// redux.js
...
const store = createStore(...);
sagaMiddleware.runSaga(rootSaga, {store});

// root-saga.js
export default function * rootSaga(context) {
  yield setContext(context);
  yield fork(watchBackButton);
}

// watch-back-button.js
export function* backButtonListen() {
  const store = yield getContext('store');
  return eventChannel(emitter => {
    const backHandlerListener = BackHandler.addEventListener(
      "hardwareBackPress",
      () => {
        emitter("back pressed");
        return store.getState().foo === 'bar';
      }
    );
    return () => {
      backHandlerListener.remove();
    };
  });
}

export function* watchBackButton() {
  const chan = yield call(backButtonListen);
  try {
    while (true) {
      let back = yield take(chan);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...