我正在开发一个天气应用程序,使用openweathermap API,我已经成功实现了一切,现在我想使用从expo Apploading 从API获取结果,因此当mainScreen打开时,所有数据都被提取并在屏幕上呈现,而不是等待来自API的响应,
weatherAPI.js:
const rootUrl = 'http://api.openweathermap.org/data/2.5/weather?appid=API_KEY'
export const fetchWeather = (lat,lon) => {
const url = rootUrl+'&lat='+lat+"&lon="+lon+"&units=metric"
console.log(url)
return fetch(url)
.then(res => res.json())
.then(json => ({
temp: json.main.temp,
pressure: json.main.pressure,
humidity: json.main.humidity,
maxTemp: json.main.temp_max,
minTemp: json.main.temp_min,
weather: json.weather[0].main,
weatherDescription: json.weather[0].description,
name: json.name,
country: json.sys.country,
windSpeed: json.wind.speed,
windDeg: json.wind.deg,
clouds: json.clouds.all,
sunrise: json.sys.sunrise,
sunset: json.sys.sunset,
}))
}
Home.js:
componentDidMount(){
this._getData()
}
_getData(){
navigator.geolocation.getCurrentPosition(
(posData) => fetchWeather(posData.coords.latitude, posData.coords.longitude)
.then(res => this.setState({
temp: Math.round(res.temp),
weather: res.weather,
weatherDescription: res.weatherDescription,
name: res.name,
country: res.country,
})),
(error)=> alert(error),
{timeout:10000}
)
}
此外,也许这是一个非常基本的问题:
我想创建一个加载图标,以重新加载数据?我对这个解决方案的方法是使用onPress调用this_getData()的touchableOpacity,但我觉得编码是错误的吗?
答案 0 :(得分:0)
来自Expo的Apploading https://docs.expo.io/versions/latest/sdk/app-loading的文档,它旨在用于初始加载应用程序。 通常,对于诸如请求天气信息之类的异步请求,通常有3个状态,即进度,成功,失败。您应该确保适当地渲染所有这些状态。当提取正在进行时,您可以呈现活动指标https://facebook.github.io/react-native/docs/activityindicator.html 您可以使用手动重试/更新按钮来获取最新数据,也可以使用定时器以特定间隔获取最新数据
答案 1 :(得分:0)
请使用此绑定_getData或使用胖箭头功能。这可能会解决问题。