2016-09-24 48 views
1

我有以下一段代碼,使用回調進行異步ajax調用。如何處理來自多個異步調用異步調用回調的數據?

我的第一個主要問題是,當我使用回調函數setA,setB,...執行數據操作時,從ajax調用返回的值並不總是存在,我結束對來自「dataFromAjax」的未識別變量進行操作。只有當我知道我在函數setA設置的dataFromAjax ['firstCall']中有一些數據時,是否有方法在setB中執行操作?

第二個問題是否有一種方法可以簡化代碼,而無需爲每個數據操作創建新的成功函數?

dataFromAjax = {}; 

function makeACall(url,successCallBack,errorCallback){ 
    $.ajax({ 
      type: 'GET', 
      async: true, 
      url: url, 
      success: successCallBack, 
      error: errorCallback 
      }); 
} 

makeACall(url,setA,errorAjax) 
makeACall(url,setB,errorAjax) 
makeACall(url,setC,errorAjax) 
makeACall(url,setD,errorAjax) 

function setA(ajaxData){ 
    dataFromAjax['firstCall'] = ajaxData;  
} 

function setB(ajaxData){ 
    dataFromAjax['secondCall'] = dataFromAjax['firstCall'] + ajaxData;  
} 

function setC(ajaxData){ 
    dataFromAjax['thirdCall'] = dataFromAjax['secondCall']/ajaxData;  
} 

回答

1

您可以$.when功能嘗試,這裏是文檔https://api.jquery.com/jquery.when/ 基本上你的代碼可能看起來像例如:

$.when($.ajax("/page1.php"), $.ajax("/page2.php")).done(function(a1, a2) { 
    // a1 and a2 are arguments resolved for the page1 and page2 ajax requests, respectively. 
    // Each argument is an array with the following structure: [ data, statusText, jqXHR ] 
    var data = a1[ 0 ] + a2[ 0 ]; // a1[ 0 ] = "Whip", a2[ 0 ] = " It" 
    if (/Whip It/.test(data)) { 
    alert("We got what we came for!"); 
    } 
}); 

在你的情況類似(取決於你想要達到的目標)

$.when($ajax.(url), $.ajax(url), $.ajax(url), $.ajax(url)).then(success, error); 

function success(a, b, c, d) { return (a+b)/c; } 
function error() { /* error handling */ }  
+0

非常有趣,我會測試它。 –

+0

非常好的例子,正是我正在尋找。 –

0

如果您想檢查對象中是否存在屬性(使其更加一致)。

if (dataFromAjax.firstCall) { 
    dataFromAjax.secondCall = dataFromAjax.firstCall + ajaxData; 
} 

我不知道如果我理解,但如果你不想讓每一個AJAX調用一個獨立的成功回調,你可以做一個默認的和刪除的理由。

function defaultSuccess(ajaxData) { 
    // do what you want 
} 

function makeACall(url, errorCallback){ 
    $.ajax({ 
      type: 'GET', 
      async: true, 
      url: url, 
      success: defaultSuccess, 
      error: errorCallback 
      }); 
} 
+0

'if(dataFromAjax.firstCall)'看起來像是一次性檢查 –