Почему функция генератора React с выходом не ждет? - PullRequest
0 голосов
/ 09 февраля 2020

В приложении React я не понимаю, почему строка доходности в функции генератора не «ждет»? В частности, в функции LOGIN, приведенной ниже, я ожидаю, что линия Yield будет следовать сразу за console.log («Шаг 3») до pause до ее завершения; однако это НЕ делает паузу и Шаг 8 немедленно обрабатывается. Я ожидаю, что ШАГИ в console.log будут следовать логическому порядку номеров. Фактический порядок, который распечатывается в окне консоли браузера: 1,2,3,8,9,10,4,5,6,7 . Может кто-нибудь объяснить, почему он НЕ делает паузу?

export function* LOGIN({ payload }) {
  const { email, password } = payload

  yield put({
    type: 'user/SET_STATE',
    payload: {
      loading: true,
    },
  })

  let userCog
  try {
    console.log("Step 1")
    userCog = yield call(login, email, password)
    console.log("Step 2")
  } catch (err) {
    if (err.code === 'UserNotConfirmedException') {
      yield put({
        type: 'user/SET_STATE',
        payload: {
          loading: true,
          email,
        },
      })
      yield history.push('/system/verification')
    }
  }
  console.log("Step 3")
  yield put({
    type: 'user/LOAD_CURRENT_ACCOUNT',
  })

  console.log("Step 8")
  if (userCog) {
    console.log("Step 9")
    yield history.push('/dashboard/analytics')
    console.log("Step 10")
  }
}

export function* LOAD_CURRENT_ACCOUNT() {
  yield put({
    type: 'user/SET_STATE',
    payload: {
      loading: true,
    },
  })

  console.log("Step 4")
  const response = yield call(currentUser)
  console.log("Step 5")
  if (response) {
    const { username } = response
    yield put({
      type: 'user/SET_STATE',
      payload: {
        id: '123',
        name: 'Administrator',
        email: username,
        role: 'admin',
        authorized: true,
      },
    })
  }
  console.log("Step 6")
  yield put({
    type: 'user/SET_STATE',
    payload: {
      loading: false,
    },
  })
  console.log("Step 7")
}

РЕДАКТИРОВАТЬ: Вот отправка редукса из компонента пользовательского интерфейса входа

 onSubmit = event => {
    event.preventDefault()
    const { form, dispatch } = this.props
    form.validateFields((error, values) => {
      if (!error) {
        dispatch({
          type: 'user/LOGIN',
          payload: values,
        })
      }
    })
  }

...