2017-02-11 8 views
0

こんにちは気象プロジェクト用に2つのJSONリクエストがあります。ユーザーの2番目のリクエストをパーソナライズするために最初のリクエストからデータが必要です。私の最初のリクエストはユーザーの緯度と経度を取得し、2番目のリクエストはその場所の現在の天気予報のURLの座標を必要とします。時系列同期getJSONリクエストの実行

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()は2番目の.then()JSON要求の前に実行されているようです。 私は、私が気付いていない、根本的に何かをやっているかもしれないので、遅延オブジェクトに新しいですか?

答えて

0

まず...、すべてのAPIのような方法を実装していない約束の一部である)(、互いの内側に自分自身を呼び出すことにより、一緒に.then使用する必要がそれらをしていない連鎖ありませんを使用し、.then()のみを使用してください。 .done()は標準ではなく、いくつかの奇妙な振る舞いをしています。 .then()が標準です。

第2に、.then()の中に2つ目の約束事があるときは、それを正しく連結するために.then()ハンドラから返す必要があります。

構造的に、あなたはそれが次のようになりたい:

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

そして、NOグローバルが全く最後.then()ハンドラに最終的な結果を得るために、ここで必要とされていないことに注意してください。また、これが役に立つかもしれません:それはシーケンシングおよびエラーを伝播するか、複数の非同期動作を調整することになると

How to chain and share prior results with Promises

+0

ありがとう!私は何をしているのか正確には分かっていませんでしたが、提供した構造が大きく助けられました。 – Doodles

-1

は、

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 
    }); 
    }); 
}); 
+0

約束は、特定のプレーンなコールバックよりも、非同期操作を管理するためのより強力な手法です。 – jfriend00

+0

助けてくれてありがとう、コードは絶対に働いたが、約束でそれをすることは初心者のためのより良い学習経験である – Doodles

関連する問題