运行按时间顺序排列的同步getJSON请求

时间:2017-02-11 05:05:42

标签: javascript jquery json ajax jquery-deferred

您好我有两个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请求之前运行。 我是延迟对象的新手,所以我可能会做一些我根本不知道的事情?

2 个答案:

答案 0 :(得分:0)

首先,请勿使用.done(),仅使用.then().done()是非标准的并且有一些奇怪的行为。 .then()是标准的。

其次,当你在.then()中有第二个承诺时,你需要从.then()处理程序返回它,以便正确地链接它。

在结构上,您希望它看起来像这样:

$.getJSON(...).then(function(result1) {
    return $.getJSON(...)
}).then(function(result2) {
   // do stuff here
});

并且,请注意,这里根本不需要全局变量,以便将最终结果输入到最后一个.then()处理程序中。您可能还会发现这很有用:

How to chain and share prior results with Promises

答案 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
    });
  });
});