Как сундук-саг срабатывает дальше в функции - PullRequest
0 голосов
/ 22 сентября 2018

Я из избыточного использования и знаю концепцию промежуточного программного обеспечения, где мы использовали, чтобы получить ответ API и прикрепить его к хранилищу с действиями диспетчеризации. В избыточном коде код в следующем формате и с небольшим знанием функции генератораЯ знаю, что функция останавливается на yield и снова получает триггеры только с .next. Может ли кто-нибудь объяснить нижеследующий случай

function* fetchUser(action) {
   try {
      const user = yield call(Api.fetchUser, action.payload.userId);
      yield put({type: "USER_FETCH_SUCCEEDED", user: user});
   } catch (e) {
      yield put({type: "USER_FETCH_FAILED", message: e.message});
   }
}

/*
  Starts fetchUser on each dispatched `USER_FETCH_REQUESTED` action.
  Allows concurrent fetches of user.
*/
function* mySaga() {
  yield takeEvery("USER_FETCH_REQUESTED", fetchUser);
}

/*
  Alternatively you may use takeLatest.

  Does not allow concurrent fetches of user. If "USER_FETCH_REQUESTED" gets
  dispatched while a fetch is already pending, that pending fetch is cancelled
  and only the latest one will be run.
*/
function* mySaga() {
  yield takeLatest("USER_FETCH_REQUESTED", fetchUser);
}

export default mySaga;

, как yield put вызывается после yield call без следующих

1 Ответ

0 голосов
/ 22 сентября 2018

Redux Sagas работают как сопрограммы.То есть вы не несете ответственности за итерации по саге итератору.Библиотека saga делает это за вас.

Когда вы создаете промежуточное программное обеспечение саги и предоставляете ему корневую сагу:

sagaMiddleware.run(rootSaga)

Библиотека саги создает внутренний итератор генератора rootSaga и вызывает следующий на основепо своей внутренней логике.Вот как он может читать и обрабатывать эффекты, которые вы получаете в своих сагах.

Вы никогда не будете вызывать себя при использовании redux-saga, если только вы не пишете тесты и не моделируете поведение redux-saga.

...