Redux thunk:等待异步函数分派

时间:2019-05-07 04:06:32

标签: javascript reactjs react-native redux redux-thunk

我正在创建一个React Native应用程序,并使用redux和redux-thunk实现我的API请求。我想知道如何等待动作分派,并确保状态已按照异步重击逻辑进行了更新。如果我理解正确,await将等待重击结束,但尚未分派动作。尽管,正如您在我的用法中所见,我需要修改状态以相应地进行其余代码。

actions / user.js

export const tryLogin = (
  email: string,
  password: string,
  sessionToken: string = ''
): Function => async (dispatch: Function) => {
  const logUser = () => ({ type: LOG_USER })

  const logUserSuccess = (data: any, infos: any) => ({
    type: LOG_USER_SUCCESS,
    data,
    infos,
  })

  const logUserError = (signinErrorMsg: string) => ({
    type: LOG_USER_ERROR,
    signinErrorMsg,
  })

  dispatch(logUser())

  try {
    { /* Some API requests via axios */ }

    dispatch(logUserSuccess(responseJson, infos))
    return true
  } catch (error) {
    { /* Error handling code */ }

    dispatch(logUserError(error.response.data.error))
    return false
}

reducers / user.js

case LOG_USER:
  return {
    ...state,
    isLoggingIn: true,
  }
case LOG_USER_SUCCESS:
  return {
    ...state,
    isLoggingIn: false,
    data: action.data,
    infos: action.infos,
    error: false,
    signinErrorMsg: '',
  }
case LOG_USER_ERROR:
  return {
    ...state,
    isLoggingIn: false,
    error: true,
    signinErrorMsg: action.signinErrorMsg,
  }

RegisterScreen.js

if (await trySignup(
    emailValue,
    firstNameValue,
    lastNameValue,
    passwordValue,
    birthdateValue,
    genderValue
  )
) {
  if (userReducer.data) {
    navigation.navigate('Secured')
  }

2 个答案:

答案 0 :(得分:2)

在Redux中, 将动作分派到商店后,它将使用新的道具自动更新UI的状态。

您可以在减速器signUpSuccess中添加类似于isLoggingIn标志的标志,而不是监视已调度的动作,并聆听componentDidUpdate生命周期方法中的更改。

trySignup可以分别调用(例如在事件,formSubmit,单击按钮等上)

RegisterScreen.js

class RegisterScreen extends React.Component{
...
componentDidUpdate(prevProps) {
  if (prevProps.signUpSuccess !== this.props.signUpSuccess){
    if (this.props.signUpSuccess) {
      navigation.navigate('Secured')
    }
  }
}
...
}
const mapStateToProps = (state) => ({
  signUpSuccess: state.userReducer.signUpSuccess,
});

export default connect(mapStateToProps)(RegisterScreen);

答案 1 :(得分:1)

  

如果我理解正确,await将等待重击结束   但该动作尚未分派。

  • 如果道具发生任何更改,则可以更新渲染,因此请在渲染方法中提取道具,并根据道具的变化更新UX。
  • 我建议您使用React native debugger检查您的操作 和当前的保存状态。