您好我有两个JSON请求要进行天气项目,我需要第一个请求中的数据,以便为用户个性化第二个请求。我的第一个请求获取用户的纬度和经度,第二个请求需要在该位置的当前天气的网址中的那些坐标。
var arrLocat = [];//users suburb, city, country, lat and lon
var userURL = "";//specific url tailored off users lat and lon
var userWeather = [];//current weather at users lat and lon
$(document).ready(function(){
//first JSON request
$.getJSON("http://ip-api.com/json", function (data){
arrLocat = data;
userURL = "http://api.openweathermap.org/data/2.5/weather?lat=" + arrLocat.lat + "&lon=" + arrLocat.lon + "&appid=61c4ebe6f40d2e2d7085e7c42d287e1d&units=metric";
console.log(arrLocat);THIS RETURNS FIRST, WORKS FINE
})
//second JSON request
.then(function(){
$.getJSON(userURL).done(function(index){
userWeather = index;
console.log(userWeather);//THIS RETURNS LAST, WORKS FINE BUT SHOULD RETURN SECOND
});
})
//do stuff here
.then(function(){
$("#locat").text(arrLocat.city + ", " + arrLocat.regionName + ", " + arrLocat.country);
console.log(userWeather);//THIS RETURNS BLANK GLOBAL VALUE, NOT CARRYING VALUE FROM SECOND .THEN FUNCTION ALSO SHOULD RETURN LAST NOT SECOND
})
});
我试图按照它们编写的顺序运行它们,我知道getJSON是异步的,但我认为.then()是强制命令,等待前一个完成后再执行。
我花了很长时间才弄清楚发生了什么,似乎我的最终.then()在第二个.then()JSON请求之前运行。 我是延迟对象的新手,所以我可能会做一些我根本不知道的事情?
答案 0 :(得分:0)
首先,请勿使用.done()
,仅使用.then()
。 .done()
是非标准的并且有一些奇怪的行为。 .then()
是标准的。
其次,当你在.then()
中有第二个承诺时,你需要从.then()
处理程序返回它,以便正确地链接它。
在结构上,您希望它看起来像这样:
$.getJSON(...).then(function(result1) {
return $.getJSON(...)
}).then(function(result2) {
// do stuff here
});
并且,请注意,这里根本不需要全局变量,以便将最终结果输入到最后一个.then()
处理程序中。您可能还会发现这很有用:
答案 1 :(得分:-1)
通过在彼此内部调用它们将它们链接在一起,不需要使用.then()这是一个承诺的一部分,而不是所有API的实现方式......
var arrLocat = [];//users suburb, city, country, lat and lon
var userURL = "";//specific url tailored off users lat and lon
var userWeather = [];//current weather at users lat and lon
$(document).ready(function(){
//first JSON request
$.getJSON("http://ip-api.com/json", function (data){
arrLocat = data;
userURL = "http://api.openweathermap.org/data/2.5/weather?lat=" + arrLocat.lat + "&lon=" + arrLocat.lon + "&appid=61c4ebe6f40d2e2d7085e7c42d287e1d&units=metric";
console.log(arrLocat);
$.getJSON(userURL).done(function(index){
userWeather = index;
console.log(userWeather);//THIS RETURNS LAST, WORKS FINE BUT SHOULD RETURN SECOND
$("#locat").text(arrLocat.city + ", " + arrLocat.regionName + ", " + arrLocat.country);
console.log(userWeather);//THIS RETURNS BLANK GLOBAL VALUE, NOT CARRYING VALUE FROM SECOND .THEN FUNCTION ALSO SHOULD RETURN LAST NOT SECOND
});
});
});