сделать yield.put одним за другим в redux-саге - PullRequest
0 голосов
/ 21 марта 2019

У меня есть yield.put, который должен произойти один за другим, поскольку асинхронное поведение мне не подходит для этой реализации.

функция генератора

export function * createUser (action) {
  try {
    axios.defaults.headers.common['Authorization'] =
      'Bearer ' + localStorage.getItem('userAccessToken')
    console.log(action.payload)
    const user = yield call(axios.post, api.createUser, action.payload)
    yield put(actionCreators.addUserSuccess(user.data))

    const qs = queryString.stringify(action.payload)
    const endpoint = `${api.createUser}?${qs}`
    console.log(endpoint)
    const users = yield call(axios.get, endpoint)
    console.log(users)

    yield put(actionCreators.fetchUsersSuccess(users.data))
  } catch (error) {
    yield put(actionCreators.addUserFailure(error))
  }
}

У меня есть эта функция генератора иЯ хочу, чтобы yield put(actionCreators.addUserSuccess(user.data)) завершился до того, как yield put(actionCreators.fetchUsersSuccess(users.data)) будет вызван

. Любая помощь по этому вопросу будет оценена

1 Ответ

1 голос
/ 21 марта 2019

Вот несколько подходов к этому:

  • Сделать actionCreators.addUserSuccess блокировку

  • Отправить другое действие, когда actionCreators.addUserSuccess завершит

Создание actionCreators.addUserSuccess блокирования

Существует создатель эффекта putResolve для блокировки эффекта.Это полезно только тогда, когда addUserSuccess возвращает обещание, которое необходимо выполнить.

    const response = yield putResolve(actionCreators.addUserSuccess(user.data))
    // use resolved promise in next operation

Отправка другого действия, когда actionCreators.addUserSuccess completes)

Где actionCreators.addUserSuccess нене возвращайте обещание, это лучший способ.

Отправьте другое действие, когда actionCreators.addUserSuccess завершит, тогда take это действие.

    while (true) {
      // say this is the action type that is dispatched in the 
      // middleware that runs actionCreators.addUserSuccess
      const action = yield take('FETCH_USERS'); 
      yield put(actionCreators.fetchUsersSuccess(action.users.data))
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...