对于循环 api,获取天气描述



我想构建一个函数,使用开放天气图API获取四个城市的预报天气描述。城市放置在名为"cities"的变量的列表中。我想我必须创建一个 for 循环来通过 API 运行所有城市?

结果应该是一个列表,其中所有城市都显示未来 8 天的 8 个天气描述。

这就是我目前所拥有的。有什么建议吗?

function getDescriptions(){

var cities = [Cannes, London, Amsterdam, Berlin];

$.ajax({
url: 'http://api.openweathermap.org/data/2.5/forecast/daily?q=' + city + "&units=metric" + "&cnt=8" + "&APPID=***",
type: "GET",
dataType: "jsonp",
success: function(data){         

var descriptions = data.list[i].weather[0].description;            

}                       
});        
}

会让你感到困惑的是 ajax 调用是异步的,所以你不能只是"返回"结果。(请参阅如何从异步调用返回响应?

因此,您的getDescriptions将需要返回一个承诺,该承诺在所有 ajax 调用完成后解析。

function getDescriptions(cities){
var requests = cities.map(function(city){
return $.ajax({
url: 'http://api.openweathermap.org/data/2.5/forecast/daily?q=' + city + "&units=metric" + "&cnt=8" + "&APPID=***",
type: "GET",
dataType: "jsonp"       
}).then(function(data){
return data.weather[0].description
});     
});
return Promise.all(requests);

}
var cities = ["Cannes", "London", "Amsterdam", "Berlin"];
getDescriptions(cities).then(function(results){
console.log(results);
});

我认为您最好的方法是将所有城市的推送到 api,然后获得所有详细信息作为回报,但我猜这是行不通的。

对象呢?

function getDescriptions(){
var cities = {
'Cannes': '', 'London': '', 'Amsterdam': '', 'Berlin': ''} 
for (var city in cities) {
$.ajax({
url: 'http://api.openweathermap.org/data/2.5/forecast/daily?q=' + city + "&units=metric" + "&cnt=8" + "&APPID=***",
type: "GET",
dataType: "jsonp",
success: function(data){         
cities[city] = data.weather[0].description;            
}                       
});  
document.write(city+ "- " + cities[city])
}
}