Redux-saga, yield call (history.push, 'pathname'), работает только в первый раз, блокируя все остальные вызовы - PullRequest
1 голос
/ 16 марта 2019

Я работаю с реагировать 16.8.2 .

У меня есть простой код наблюдателя саги:

export default function* taskWatcher() {
  yield all([
    fork(subTaskWatcher1),
    fork(subTaskWatcher2),
  ])
}

и код под-наблюдателя,

function* subTaskWatcher2() {
  const actionObj = yield take('ACTION');
  const { history } = actionObj.payload;
  let validated = false;
  //... some Computation to validate navigation ... //
  if (validated) yield call(history.push, '/pathname')
}

, который перехватывает действие и на основе некоторых вычислений определяет, должен ли быть задан новый путь в history объекте или нет.

Это хорошо работает только в первый раз, когда я взаимодействую с CTA, которыйзапускает код выше.Все другие взаимодействия пропускаются, в результате call эффекта саги, являющегося блокирующим вызовом.

Под этим я подразумеваю следующее: если я вернусь на страницу, имеющую CTA,
иесли я нажму на него еще раз, навигация сейчас не будет.

Обсуждение вопроса this github относится к моей проблеме.

Я упомянул this ответ.На самом деле это не относится к моей проблеме.

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

1 Ответ

0 голосов
/ 17 марта 2019

В соответствии с предложением @Jotakun об использовании takeEvery, после прохождения шаблона takeEvery в саго-документах, похоже, работает следующее решение:

function* subTask2Worker(actionObj) {
  const { history } = actionObj.payload;
  let validated = false;
  //... some Computation to validate navigation ... //
  if (validated) yield call(history.push, '/pathname')
}

function* subTaskWatcher2() {
  yield takeEvery('ACTION', subTask2Worker);
}

export default function* taskWatcher() {
  yield all([
    fork(subTaskWatcher1),
    fork(subTaskWatcher2),
  ])
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...