Javascript 引发错误时,反应本机获取无法设置状态 背景

Javascript 引发错误时,反应本机获取无法设置状态 背景,javascript,reactjs,react-native,fetch,react-native-android,Javascript,Reactjs,React Native,Fetch,React Native Android,我正在尝试使用React本机组件中的fetch()函数处理错误的HTTP响应。我使用了建议创建一个模块来处理响应错误的代码 // ApiUtils.js var ApiUtils = { checkStatus: function(response) { if (response.status >= 200 && response.status < 300) { return response; } else { le

我正在尝试使用React本机组件中的
fetch()
函数处理错误的HTTP响应。我使用了建议创建一个模块来处理响应错误的代码

// ApiUtils.js

var ApiUtils = {  
  checkStatus: function(response) {
    if (response.status >= 200 && response.status < 300) {
      return response;
    } else {
      let error = new Error(response.statusText);
      error.response = response;
      throw error;
    }
  }
};
export { ApiUtils as default };
问题: 为什么
.catch
lambda无法访问上一个函数所在的
this.setState
?我可以使用
.bind()

后续问题 如果无法在
catch
函数中访问
this.setState
,如果HTTP响应不佳,如何将
state.load\u failed
更改为
true

尝试修复 我试图将异常传递给调用函数,然后更改父函数的状态,如下所示:

我将
.catch()
函数更改为:

fetchData(){
    fetch(GLOBAL.BASE_URL + "/" + this.props.url_section + "/" + String(this.props.weekNo) + "/")
      .then(ApiUtils.checkStatus)
      .then((response) => {
        return response.json()
      })
      .then((responseData) => {
          . . .
      })
      .catch(function(error){
        console.log("Error!");
        throw error;
      })
      .done();
  }
然后将调用函数更改为:

componentDidMount(){
try{
  this.fetchData();
}
catch(error){
  this.setState({load_failed: true});
}
console.log(this.state.load_failed);
}

然而,我得到了一个简单的
异常管理器.js:55错误

我尝试删除
.done()
,但
catch
块无法处理异常,状态未更改,我收到一条警告:
可能未处理的承诺拒绝(id:0):
。我意识到这可能与javascript中的异步函数以及错误传递给什么有关,但我不是100%确定


环境:OSX 10.10、Android 4.1.2、React native 0.29.2

您的函数没有在与预期相同的上下文(
此值)中运行。要解决此问题,请使用箭头函数,该函数保持与此相同的

.catch(error => {
  console.log("Error:" + error.message);
  this.setState({load_failed: true});
})
.catch(function(error){
  console.log("Error:" + error.message);
  this.setState({load_failed: true});
}.bind(this))
或者显式地
绑定到当前

.catch(error => {
  console.log("Error:" + error.message);
  this.setState({load_failed: true});
})
.catch(function(error){
  console.log("Error:" + error.message);
  this.setState({load_failed: true});
}.bind(this))

谢谢,使用箭头功能非常适合我的情况:)