React Native:可能未处理的承诺拒绝 [英] React Native: Possible unhandled promise rejection
问题描述
我收到以下错误:可能未处理的承诺拒绝(id:0:网络请求失败
这是承诺代码,我看不出这里有什么问题,有什么想法吗?
Here's the promise code, I don't see what's wrong here, any ideas?
return fetch(url)
.then(function(response){
return response.json();
})
.then(function(json){
return {
city: json.name,
temperature: kelvinToF(json.main.temp),
description: _.capitalize(json.weather[0].description)
}
})
.catch(function(error) {
console.log('There has been a problem with your fetch operation: ' + error.message);
});
}
**Edit: 我添加了一个 catch 函数并得到了一个更好的错误 你传递了一个未定义或空的状态对象;相反,使用 forceUpdate().index.ios.js:64 未定义
** I added a catch function and got a better error You passed an undefined or null state object; instead, use forceUpdate(). index.ios.js:64 undefined
这是 index.ios.js 代码.网址很好,并为我提供了正确的 json 数据.我可以通过控制台日志看到 region.latitude
和 region.longitude
在 Api(region.latitude, region.longitude)
中都可用.但是 data
是未定义的.我仍然不确定发生了什么,为什么 data
有问题以及为什么它没有定义.
Here's the index.ios.js code. The url is fine and giving me the correct json data. I can see with console log that both region.latitude
and region.longitude
are available in Api(region.latitude, region.longitude)
. But data
is undefined. I'm still not sure what's going on, why there's a problem with data
and why it's undefined.
// var React = require('react-native'); --deprecated
// updated
import React from 'react';
// updated
import {
AppRegistry,
MapView,
View,
Text,
StyleSheet,
} from 'react-native';
/*
var {
AppRegistry,
MapView,
View,
Text,
StyleSheet
} = React;
*/ // -- depreciated
var Api = require('./src/api');
var Weather = React.createClass({
getInitialState: function() {
return {
pin: {
latitude: 0,
longitude: 0
},
city: '',
temperature: '',
description: ''
};
},
render: function() {
return <View style={styles.container}>
<MapView
annotations={[this.state.pin]}
onRegionChangeComplete={this.onRegionChangeComplete}
style={styles.map}>
</MapView>
<View style={styles.textWrapper}>
<Text style={styles.text}>{this.state.city}</Text>
<Text style={styles.text}>{this.state.temperature}</Text>
<Text style={styles.text}>{this.state.description}</Text>
</View>
</View>
},
onRegionChangeComplete: function(region) {
this.setState({
pin: {
longitude: region.longitude,
latitude: region.latitude
}
});
Api(region.latitude, region.longitude)
.then((data) => {
console.log(data);
this.setState(data);
});
}
});
var styles = StyleSheet.create({
container: {
flex: 1,
justifyContent: 'center',
alignItems: 'stretch',
backgroundColor: '#F5FCFF'
},
map: {
flex: 2,
marginTop: 30
},
textWrapper: {
flex: 1,
alignItems: 'center'
},
text: {
fontSize: 30
}
});
AppRegistry.registerComponent('weather', () => Weather);
推荐答案
api 中的 catch 函数应该返回一些可以由 React 类中的 Api 调用处理的数据,或者抛出应该使用 catch 函数在 React 类中捕获的新错误你的 React 类代码.后一种方法应该类似于:
catch function in your api should either return some data which could be handled by Api call in React class or throw new error which should be caught using a catch function in your React class code. Latter approach should be something like:
return fetch(url)
.then(function(response){
return response.json();
})
.then(function(json){
return {
city: json.name,
temperature: kelvinToF(json.main.temp),
description: _.capitalize(json.weather[0].description)
}
})
.catch(function(error) {
console.log('There has been a problem with your fetch operation: ' + error.message);
// ADD THIS THROW error
throw error;
});
然后在你的 React 类中:
Then in your React Class:
Api(region.latitude, region.longitude)
.then((data) => {
console.log(data);
this.setState(data);
}).catch((error)=>{
console.log("Api call error");
alert(error.message);
});
这篇关于React Native:可能未处理的承诺拒绝的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!