Как я справляюсь с несколькими действиями, вызывающими разные функции в Redx Saga? - PullRequest
0 голосов
/ 08 мая 2018

Вот пример, который будет легче понять.

function* a() {
 yield takeEvery(action.LOGIN_SUCCESS, b)
}

function* b() {
  yield takeEvery(action.FETCH_SUCCESS, c)
}

function* c() {
  yield console.log('action from function a')

}

function* d() {
yield takeEvery(action.FETCH_SUCCESS, e)

}

function* e() {
  yield console.log('action from function d')
}



yield all([
  fork(a),
  fork(d),
])

Если происходит LOGIN_SUCCESS, то функция b начинает ожидать FETCH_SUCCESS. В то же время функция d ожидает FETCH_SUCCESS.

Вопрос: как я могу остановить запуск функции d после того, как takeEvery в функции a выполнит действие LOGIN_SUCCESS, а затем действие FETCH_SUCCESS?

В этом случае я хочу, чтобы вызывалась только функция c. Вместо этого происходит то, что и функция c, и функция e вызываются, потому что происходит FETCH_SUCCESS.

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

1) LOGIN_SUCCESS -> FETCH_SUCCESS -> function c

2) FETCH_SUCCESS -> function e

Надеюсь, я достаточно ясно:)

1 Ответ

0 голосов
/ 08 мая 2018

Как насчет модификации саги d примерно так:

function* d() {
  const task = yield takeEvery(action.FETCH_SUCCESS, e)
  yield take(action.LOGIN_SUCCESS)
  yield cancel(task)
}

Это убьет takeEvery в саге d после отправки LOGIN_SUCCESS.

Поскольку вы используете takeEvery для LOGIN_SUCCESS Я предполагаю, что это может происходить несколько раз. В этом случае вы, вероятно, захотите запустить другую сагу d при выходе из системы.

...