Javascript 引发错误时,反应本机获取无法设置状态 背景
我正在尝试使用React本机组件中的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
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))
谢谢,使用箭头功能非常适合我的情况:)