React native 等待调度在操作中完成

React native 等待调度在操作中完成,react-native,react-redux,React Native,React Redux,我有一个从firebase实时数据库加载用户数据的函数。该函数调用在componentDidMount的主加载屏幕中加载数据的操作。问题是加载页面在加载完成之前会导航到主屏幕,从firebase获取数据并发送 在应用程序运行开始时调用的函数: async componentDidMount(){ .... if (facebookToken !== null){ await this.props.loadData(); this.props.navig

我有一个从firebase实时数据库加载用户数据的函数。该函数调用在componentDidMount的主加载屏幕中加载数据的操作。问题是加载页面在加载完成之前会导航到主屏幕,从firebase获取数据并发送

在应用程序运行开始时调用的函数:

async componentDidMount(){
....

     if (facebookToken !== null){
        await this.props.loadData();
        this.props.navigation.navigate("MainScreen"); 
....
    }
以及正在调用的操作:

export const loadData = () => async dispatch => {

    firebase.auth().onAuthStateChanged((user) => {
    dispatch({ type: SAVE_USER, payload: {prop: "uid", value: user.uid}});
    firebase.database().ref(`/users/${user.uid}`)
            .once('value', snapshot => {
              dispatch({type: UPDATE_CREDENTIALS, payload: { prop: "phone", value: snapshot.val().phone}});
              dispatch({type: UPDATE_CREDENTIALS, payload: { prop: "country", value: snapshot.val().country}});
              dispatch({ type: SAVE_USER, payload: {prop: "name", value: snapshot.val().name}});
              dispatch({ type: SAVE_USER, payload: {prop: "fbPicture", value: snapshot.val().photo}});
            })
          }
  });

...
}
我似乎找不到有效的解决方案,以便在继续导航到主屏幕之前完成数据调用

定义名为“loadInProgress”的redux状态变量,并将其初始化为true。 当加载数据成功“加载成功”时,将“loadInProgress”设置为false。我不确定如果“加载失败”失败,您想做什么 在“渲染”中,选中“this.props.loadInProgress”,如果为false,则导航到另一个屏幕。 如果出现“无法在现有状态转换期间更新”错误,请将此检查移至componentDidUpdate
好的,我找到了一个解决方案:

我在行动电话中添加了一个.then语句,以便:

async componentDidMount(){
....

 if (facebookToken !== null){
    await this.props.loadData().then(() => {
    this.props.navigation.navigate("MainScreen");  })


....
    }
在操作中,我使用returnnewpromise包装函数调用,并在所有分派调用完成后使用resolve:

  return new Promise( (resolve, reject) => {
    firebase.auth().onAuthStateChanged((user) => {
       dispatch({ type: SAVE_USER, payload: {prop: "uid", value: user.uid}});
       firebase.database().ref(`/users/${user.uid}`)
                 .once('value', snapshot => {
                   if (snapshot.val() !== null){
                      dispatch({type: UPDATE_CREDENTIALS, payload: { prop: "phone", value: snapshot.val().phone}});
                      dispatch({type: UPDATE_CREDENTIALS, payload: { prop: "country", value: snapshot.val().country}});
                      dispatch({ type: SAVE_USER, payload: {prop: "name", value: snapshot.val().name}});
                      dispatch({ type: SAVE_USER, payload: {prop: "fbPicture", value: snapshot.val().photo}});
                    }
                    resolve();
                });
       });
  })

不幸的是,这是对解决方案的一种绕过。我不想添加更多的逻辑。相反,我正试图找到一个可以使用wait/async或promissions的解决方案,但我还没有找到适合我的解决方案。