2014-01-07 115 views
2

首先,我知道標題看起來與自己相矛盾。執行2個異步AJAX請求,一個接一個

但是,我的問題是,我要麼一個接一個地調用2個AJAX函數,要麼調用第二個AJAX函數。

讓我把它放到上下文中..我正在寫一個「商店定位器」應用程序。默認情況下,所有結果都按字母順序加載。用戶可以將他們的地址或郵編輸入框中並點擊搜索。然後,我的應用程序將使用Google的地理編碼API從他們的輸入中找到他們的經緯度座標,然後將這些座標傳遞到我自己的AJAX調用中,然後根據他們的位置排序結果,最靠近的商店位於第一位。

但是,如果用戶沒有輸入郵編,我想回到默認狀態,並再次按字母順序顯示結果。

到目前爲止...

function generateResults(_postcode) { 
     //console.log("generating results"); 
     if (readyState) { 
      changeReadyState(false); 
      jQuery.ajax({ 
       url: "http://maps.googleapis.com/maps/api/geocode/json?address=" + encodeURIComponent(_postcode) + ",UK&sensor=false", 
       success: function(d){ 
        var _u = ajax_url; 

        if (d.results && d.results[0] && d.results[0].geometry && d.results[0].geometry.location) { 
         var location = d.results[0].geometry.location; 
         _u = appendQS(_u, "lat=" + location.lat); // Appends as query string, putting either ? or & before 
         _u = appendQS(_u, "lng=" + location.lat); 

         jQuery.ajax({ 
          url: _u, 
          success: function(data){ 

           changeReadyState(true); 
          }, 
          error: function(){ 
           changeReadyState(true); 
          }, 
          async: false 
         }); 
        } 
        else if (d.error_message) { 
         alert(d.error_message); 
         changeReadyState(true); 
        } 
        else { 
         alert("No results found for '" + _postcode + "'"); 
         postcodeTxt.val(""); 
         changeReadyState(true); 
        } 

       }, 
       error: function(){ 
        changeReadyState(true); 
       } 
      }); 
     } 
     else { 
      //console.log("Application busy, try again soon"); 
     } 
    } 

我想我可能只是有2箱子取決於_postcode是否爲空,但是這將意味着重複的代碼。

基本上我只想調用谷歌地理編碼API,如果_postcode字段不是空的,但我想確保這個調用要麼沒有提前,要麼在我調用我自己的AJAX之前完成。

我看過使第一個請求同步,但根據jQuery文檔,它已被棄用,他們建議使用它們的成功/錯誤/完整回調。

我有一種感覺,它只是在一天晚了一點!

乾杯

+0

使用某種回調類型,大多數AJAX API不僅具有成功功能:function(){}回調函數,而且還包含完整的:。您可以使用完整的{}方法來觸發您的第二個電話,以確保它們不會一起觸發。 – Rottingham

回答

0

試着這麼做:

$.when(
    $.get('path1', function(d1) { 
     // do stuff with first request data 
    }, 'datatype') 
).then(function() { 
    $.get('path2', function(d2) { 
     // do stuff with second request data 
    }, 'datatype') 
}, function(o,e,m) { 
    // handle errors 
}); 

你甚至可以做的比,如果你想只是ajax調用更多。

+0

感謝您的回覆。我認爲這可能會走上正軌。但是,我不確定這是否考慮到「郵編」是否爲空。我想要做一些類似'if(postcode!=「」){//同步AJAX調用來獲取lat,lng} //異步AJAX調用以使用lat,lng或默認順序存儲最近的商店' – Jonathon