@rndr567

Как вызвать действие после выполнения всех других?

actionsA

export default {
    getData: () => {
      type: 'A_GET_DATA',
    },
    setItems: items => {
      type: 'A_SET_ITEMS',
      payload: items,
    }
  }


actionsB

export default {
    getData: () => {
      type: 'B_GET_DATA',
    },
    setItems: items => {
      type: 'B_SET_ITEMS',
      payload: items,
    }
  }


sagaA

function* getData() {
  try {
    const result = yield call(api.get, requestsUrls.data)
    yield put(actionsA.setItems(result))
  } catch (error) {
    ...
  }
}

function* sagaA() {
  yield takeEvery('A_GET_DATA', getData)
}


sagaB

function* getData() {
  try {
    const result = yield call(api.get, requestsUrls.data)
    yield put(actionsB.setItems(result))
  } catch (error) {
    ...
  }
}

function* sagaB() {
  yield takeEvery('B_GET_DATA', getData)
}


actionsMain

export default {
    init: () => {
      type: 'MAIN_INIT',
    },
    initSuccess: () => {
      type: 'MAIN_INIT_SUCCESS',
    }
  }


sagaMain

function* init() {
  try {
    yield put(actionsA.getData())
    yield put(actionsB.getData())
    yield put(actionsMain.initSuccess())
  } catch (error) {
    ...
  }
}

function* sagaMain() {
  yield takeEvery('MAIN_INIT', init)
}


Суть вопроса в том, как сделать, что бы в функции init все выполнялось последовательно, т.е. сейчас
yield put(actionsMain.initSuccess())
выполняется раньше чем
yield put(actionsA.setItems(result))
и
yield put(actionsB.setItems(result))
  • Вопрос задан
  • 178 просмотров
Решения вопроса 1
polarlord
@polarlord
Почитайте в доке описание put. Это не блокирующий эффект. Если вам нужен порядок - используйте putResolve.
Также у вас первый и второй yield просто триггерят другие саги. Если у этих экшенов нет других side-эффектов - то проще напрямую вызывать эти саги через yield call. Тогда не будет лишних вызовов под капотом и эффект будет такой как вам надо. И в приницпе это - общепринятая практика.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы