【问题标题】:Handle async requests in react native / redux在 react native / redux 中处理异步请求
【发布时间】:2018-01-24 19:19:49
【问题描述】:

我正在使用 firebase 构建一个带有 react native 的应用程序。我正在为如何在我的应用程序中构建我的 redux 操作而苦苦挣扎。

就目前而言,我有一个可以获取用户个人资料的功能。我引用了 firebase firestore,然后使用 then 和 catch 语句来解决返回的承诺。这就是我的问题所在。

return(dispatch){
dispatch({type: GET_PROFILE})
var docRef = firebase.firestore().doc('users/' + userUid);
docRef.get()
.then(() => {
    dispatch({type: GET_PROFILE_SUCCESS})
})
.catch(() => {
   dispatch({type: GET_PROFILE_FAIL})
})
}

我正在调度操作 GET_PROFILE,以便在我的个人资料屏幕中调用我的渲染函数时,它会在用户等待时加载一个微调器。 我遇到的问题是,如果用户没有连接到互联网。当他们发出请求时,动作被发送到 redux 但 GET PROFILE SUCCESS / FAIL 永远不会被调度,因为没有互联网连接不是错误

因此,用户在重新启动应用程序之前看到的只是一个微调器。我基本上想提醒用户他们需要连接到互联网。 我是 React Native 的新手,有人可以告诉我在 React Native 中做到这一点的最佳方法是什么?

谢谢

【问题讨论】:

    标签: javascript react-native redux


    【解决方案1】:

    您可以通过NetInfo 获取网络信息并将其存储在redux 中:

    在您的主要组件中:

    componentDidMount() {
        NetInfo.isConnected.fetch().then((isConnected) => {
          store.dispatch({ type: 'CHANGE_CONNECTION_STATUS', isConnected });
        });
        NetInfo.isConnected.addEventListener('connectionChange', this.handleConnectionChange);
    }
    
    componentWillUnmount() {
        NetInfo.isConnected.removeEventListener('connectionChange', this.handleConnectionChange);
    
    handleConnectionChange = (isConnected: boolean) => {
        store.dispatch({ type: 'CHANGE_CONNECTION_STATUS', isConnected }));
    }
    

    然后您可以使用 if 语句包装您的请求以处理离线用例:

    return(dispatch){
      if(store.getState().isConnected) {
        dispatch({type: GET_PROFILE})
        var docRef = firebase.firestore().doc('users/' + userUid);
        docRef.get()
        .then(() => {
            dispatch({type: GET_PROFILE_SUCCESS})
        })
        .catch(() => {
           dispatch({type: GET_PROFILE_FAIL})
        })
      } else {
        Alert.alert('You are offline');
      }
    }
    

    【讨论】:

    • 感谢您回复 Dyo。这看起来像我可能会解决这个问题的方式。我假设我可以在用户会话的整个生命周期中保持监听器的连接?或者如果我没有卸载它,我会遇到 firebase 问题吗?谢谢
    • 我不知道如果你在卸载时不移除监听器会发生什么,但我认为你应该这样做。 firebase 不会有问题,但您的 isConnectedstate 可能是错误的
    【解决方案2】:

    您可以将这段代码用于网络故障情况

    return(dispatch){
        dispatch({type: GET_PROFILE})
        var docRef = firebase.firestore().doc('users/' + userUid);
        docRef.get()
        .then(() => {
            dispatch({type: GET_PROFILE_SUCCESS})
        }, 
          // ADD THESE LINES
          (error) => {
                dispatch({type: GET_PROFILE_FAIL})
              })
        .catch(() => {
           dispatch({type: GET_PROFILE_FAIL})
        })
        }
    

    【讨论】:

    • 嗨,Pulkit,感谢您的回答。我已经尝试过这种方法,但它似乎不起作用,这可能以某种方式与 firebase 相关吗?谢谢
    • 请控制 .then 函数和 catch 函数的两个参数中的值,并检查其中至少一个会打印该值。
    • 你好普吉。与 Internet 断开连接时,这两个函数都不会在控制台中打印值。 then 函数在连接时正确触发
    • 这可能需要一些时间。所以你可以等待 3-4 分钟。
    猜你喜欢
    • 2018-05-12
    • 2017-10-05
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多