【问题标题】:Axios not catching Network OfflineAxios 没有捕获网络离线
【发布时间】:2017-11-14 16:20:10
【问题描述】:

挑战是在 React-Native 中使用 AXIOS 库在 POST 请求期间捕获网络离线状态错误。

axios.post(Constants.API.LOGIN, {
  username: email,
  password: password
})
.then(function (response) {
  console.log('SUCCESS!');
  loginUserSuccess(dispatch, user);
})
.catch(function (error) {
  if(!error.response){
    networkError(dispatch);
  } else {
    loginUserFail(dispatch);
  }    
});

但是当我关闭 WiFi 时出现错误

Possible Unhandled Promise Rejection (id:0)

AXIOS 处理网络状态的方法是什么?

谢谢!

【问题讨论】:

    标签: react-native axios


    【解决方案1】:

    查看NetInfo:

    import { NetInfo } from 'react-native'
    

    https://facebook.github.io/react-native/docs/netinfo.html

    已连接

    适用于所有平台。异步获取布尔值以确定互联网连接。

    NetInfo.isConnected.fetch().then(isConnected => {
      console.log('First, is ' + (isConnected ? 'online' : 'offline'));
    });
    function handleFirstConnectivityChange(isConnected) {
      console.log('Then, is ' + (isConnected ? 'online' : 'offline'));
      NetInfo.isConnected.removeEventListener(
        'change',
        handleFirstConnectivityChange
      );
    }
    NetInfo.isConnected.addEventListener(
      'change',
      handleFirstConnectivityChange
    );
    

    您的处理可能会有一些额外的问题。我无法确切地看到是什么触发了代码中未处理的拒绝,但我可以假设它正在进入 catch 块。

    如果是这样,那目前意味着 networkError()loginUserFail() 失败,这实际上是产生未处理拒绝的原因。

    看看这些函数,如果它们是异步的,请确保它们内部有 catch 块。问问自己这个错误到底来自哪里,首先回答这个问题,然后查看NetInfo。否则,未处理的拒绝仍有可能发生。确保测试代码可能失败的所有不同方式:)

    使用 NetInfo,您可以通过该事件侦听器在应用架构的根级别附近设置一些东西。这可以让您管理类似Redux 的设置。如果应用检测到离线,您可以将该值设置为 false,整个应用都会知道它处于离线状态。你可能会做一个中间件。

    代码可能类似于:

    中间件:

    `store.dispatch(changeConnectivityState())`
    

    或者你可以有一个动作创建者(显示为redux-thunk):

    export function onAppConnectivityChange(newState) {
        return (dispatch) {
            dispatch({
                type: APP_CONNECTIVITY_CHANGE,
                payload: newState
            })
        }
    }
    

    Redux 减速器:

    case APP_CONNECTIVITY_CHANGE:
        return {
            ...state,
            isConnected: action.payload
        }
    

    在您的组件中:

    render() {
        if (this.props.isConnected === true) {
            return <View><Text>We are connected.</Text></View>
        }
    }
    
    const mapStateToProps = (state) => {
        const isConnected = state.someReducer.isConnected
        return {
            isConnected
        }
    }
    
    export default connect(mapStateToProps, null)(SomeComponent)
    

    希望这能给你一些想法。 Axios 不应该负责检查应用程序是在线还是离线(除了快速检查布尔值)。您的应用程序应该始终知道它是在线还是离线,并且您的组件应该能够检测到状态。您会发现它更具可扩展性且更易于使用。

    如果我看到你从哪里调用 Axios,我可以给你一个更具体的答案。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-30
    • 2014-03-23
    相关资源
    最近更新 更多