2015-11-02 58 views
0

我遇到了ajax/promise的問題。我總共有兩個ajax請求,第二個ajax調用依賴數據由第一個ajax調用返回。如何用承諾鏈接兩個ajax請求

我的第一個ajax調用查找#search的緯度,經度和國家代碼。 我的第二個ajax調用查找該城市的天氣,但API URL取決於我的第一個ajax調用返回的緯度,經度和國家代碼。所以第二個Ajax調用在第一個Ajax調用完成之前無法啓動。

我的邏輯在於var ajax1被分配了一個promise,而var ajax2在ajax1.then()檢查ajax1的promise被解析後啓動。然後ajax2運行並返回另一個承諾。最後,ajax2.done在檢查ajax2的承諾解決後啓動,然後啓動我的successWeatherFunction()。

我的問題是,ajax2.done不能正常工作,因爲console.log(「test」)沒有顯示在控制檯上。兩個較早的console.logs,console.log(info)和console.log(weatherApiUrl)正在工作。

謝謝!

$("#search").keypress(function(event) { 
if (event.which === 13) { 
    var searchCity = $("#search").val(); 
    var jsonURL = "http://autocomplete.wunderground.com/aq?query=" + searchCity + "&cb=?" 
    var ajax1 = $.getJSON(jsonURL); 
    var ajax2 = ajax1.then(function(data) { 
    var info = []; 
    info.push(data["RESULTS"][0]["name"]); 
    info.push(data["RESULTS"][0]["c"]); 
    info.push(data["RESULTS"][0]["lat"]); 
    info.push(data["RESULTS"][0]["lon"]); 
    console.log(info); 
    var searchLat = info[2]; 
    var searchLng = info[3]; 
    var countryCode = info[1]; 
    if (countryCode === "US") { 
     var weatherApiUrl = "https://api.forecast.io/forecast/{APIKEY}/" + searchLat + "," + searchLng + "?exclude=minutely" + "&callback=?"; 
    } else { 
     var weatherApiUrl = "https://api.forecast.io/forecast/{APIKEY}/" + searchLat + "," + searchLng + "?exclude=minutely" + "?units=si" + "&callback=?"; 
     console.log(weatherApiUrl); 
    } 
    return $.getJSON(weatherApiUrl); 
    }); 
    ajax2.done(function(data){ 
    console.log("test"); 
    successCityWeather(data); 
    }); 
+1

添加一些錯誤檢查...'ajax2.catch(函數(ERR){執行console.log(ERR);})有(......你做功能...);' –

+0

http://jsfiddle.net/arunpjohny/pkbfn5bt/1/ –

+0

just sayin,''?exclude = minutely「+」?units = si「'對我來說看起來像一個無效的URL部分 – Bergi

回答

1

代碼中使用thendonedone是舊承諾的jQuery語法,因此您應該只使用then

下面的代碼對我的作品:

$(function() { 
    $.get('/test').then(function() { 
    console.log('First request end'); 
    return $.get('/test'); 
    }).then(function() { 
    console.log('second request end'); 
    }); 
}); 

但在你的情況,也許你的請求的一個失敗。給第二個參數來then記錄錯誤:

$.getJSON('...').then(function(data) { 
    console.log('success', data); 
}, function(data) { 
    console.log('fail', data); 
}); 
0

如果不能確定,請始終使用always()處理程序。這樣你就會知道請求是否真的完成了,或者根本沒有完成。

$.ajax(...params...) 
     .always(function(jqXHR, textStatus) { 
      if (textStatus != "success") { 
        alert("Error: " + jqXHR.statusText); //error is always called .statusText 
      } else { 
        alert("Success: " + jqXHR.response); //might not always be named .response 
      }}); 
0
$.post(jsonURL) 
    .then(function (data) { 
     var info = []; 
     // some actions 
     return $.getJSON(weatherApiUrl); 
    }) 
    .then(function(data, status, promise) { 
     // some actions 
     successCityWeather(data); 
    }) 
+3

OPs代碼有什麼區別,爲什麼這很重要?請爲您的答案添加解釋。 – Bergi