如何从 redux 获取承诺的状态?

我在我的本机反应应用程序中使用 redux。为了更新一些配置文件数据,我在我的一个组件中调度了一个动作 updateProfile(data)


在我的组件中


values = { // some Js object values }

updateProfile(values)

在行动创造者


export const updateProfile = (details) =>(dispatch) => {


dispatch(profileLoading()) 

axios.post(SERVERURL,details)  //updating the details to the server

  .then((result)=>{            

        dispatch(addProfile(result.data[0]))   //updating the returned details to redux state

      })

  .catch((err)=>{

        dispatch(profileFailed(err.response))

      })

    })

 

}


export const profileLoading = () => ({

    type: ActionTypes.PROFILE_LOADING,

})


export const addProfile = (profile) => ({

    type: ActionTypes.ADD_PROFILE,

    payload: profile

})


export const profileFailed = (err) => ({

    type: ActionTypes.PROFILE_FAILED,

    payload: err

})

配置文件.js


import * as ActionTypes from './ActionTypes'


export const profiles = (state = {

isLoading:true,

errMess:null,

profiles:{ }


},action) =>{

    switch(action.type){

        case ActionTypes.ADD_PROFILE:

            return {...state, isLoading:false, errMess:null, profiles: action.payload}

        

        case ActionTypes.PROFILE_LOADING:

            return {...state, isLoading:true,errMess:null}

        

        case ActionTypes.PROFILE_FAILED:

            return {...state, isLoading:false,errMess:action.payload, profiles: {}}


        case ActionTypes.DELETE_PROFILE:

            return {...state,isLoading:false,errMess:null,profiles:{}}


        default:

            return state

        }   

        

}

在这一行updateProfile(values)之后,目前正在使用如下所示的 setTimeout 来了解更新的结果


updateProfile(values)

setTimeout(()=>{

    if(profiles.errMess==null){

        setCondition('completed')

        nav.navigate('some Screen')

    }

    else{

        setCondition('error')

        }

},3000)

因为我需要导航到其他屏幕,所以我不能使用 SetTimeOut,因为它会不断地产生延迟,即使更新很快完成,如果更新时间超过 3 秒,它仍然会引起头痛。我想要的是,仅当数据更新到服务器时导航到“某个屏幕”(如承诺)是的,我可以更新 redux 状态中的状态值,但我需要在组件级别实现它。我是 redux 的新手。请有人帮助我。


郎朗坤
浏览 105回答 1
1回答

子衿沉夜

我相信您可以返回 axios 请求以访问您调用它的承诺。// Action Creatorexport const updateProfile = (details) =>(dispatch) => {  dispatch(profileLoading())  return axios.post(SERVERURL,details)    .then((result) => {                  dispatch(addProfile(result.data[0]))    }).catch((err) => {      dispatch(profileFailed(err.response))    })  })}// Usagedispatch(updateProfile(values)).then((response) => {  // handle successful response}).catch((err) => {  // handle failure})
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript