2014-04-28 60 views
0

對不起,我和傢伙們似乎無法將我的頭圍繞在這一塊上,儘管我已經在線閱讀了各種場景。因此,這裏的情況:在迭代父循環之前返回AJAX數據

我有一個字符串數組稱爲recipientsList

對於數組中的每個字符串,我想打一個AJAX調用,將字符串作爲參數,然後返回從AJAX數據到我的回調函數。

我的代碼如下。發生的事情是,如果我在recipientsList數組中有三個字符串,則我的expandDistributionList函數會被調用3次,但直到我的.each完成迭代之後,代碼纔會從AJAX調用的成功部分中觸發。思考?

function expandDistributionList(emailAddress, cb) { 
    $.ajax({ 
     url: "/expandDistributionList", 
     type: 'get', 
     dataType: 'json', 
     context: this, 
     data: { 
      distListName: emailAddress, 
     },   
     success: function(data) { 
      cb(data); 
     }, 
     error: function() {     
      ace.search.mainframeErrorSignal = $.signal({ 
       'message': 'Unable to expand distribution list.', 
       'addClass': 'error', 
       'sticky': true 
      }); 
     } 
    }); 
} 

recipientsList.each(function(item) { 
    expandDistributionList(item, function(data){ 
     if(data...) { 
      //do some code here 
     } 
     else { 
      //do something else 
     } 
    }); 
}); 

回答

0

嗯, 我不知道,但這個曾與我的代碼

function sendAsJSON(url, data, async, successCallback, errorCallback) { 
     $.ajax({ 
      url: url, 
      data: data, 
      type: "POST", 
      async: true, 
      dataType: "json", 
      contentType: "application/json;charset=utf-8", 
      success: function (data) { 
       if (successCallback != null) { 
        successCallback(data.d); 
       } 
      }, 
      error: function (errorData) { 
       if (errorCallback != null) { 
        errorCallback(); 
       } 
      } 
     }); 
    } 

你不介意改變 「GET」 爲 「POST」,並添加的contentType。

+0

嗯,不知道您怎麼以上代碼將解決AJAX調用。每次結束後完成的問題。你可以解釋嗎? – Leann

+0

嗯,我不知道,我試着把我的一些代碼放在一個循環中工作正常。你會介意試試這個嗎? http://stackoverflow.com/a/7330771/1955342 – sylar

0

這是JavaScript事件模型的標準行爲,您的回調在事件隊列中排隊並在主代碼完成工作後執行;

而且因爲我的英語很差,我從書異步的JavaScript一些說明對這一

事件調度的JavaScript中的輕鬆是語言最 強大的功能之一。像setTimeout這樣的異步函數簡化了延遲執行 ,而不會產生線程。 JavaScript代碼永遠不會中斷,因爲事件只能在代碼運行時排隊纔會報告錯誤;他們不能開火,直到 完成。

您可以使用鏈條許你的異步請求,here就是很好的例子

+0

這是有道理的,但它並沒有真正闡明如何編碼問題。你可以發佈我可以遵循的代碼解決方案嗎? – Leann

+0

@Leann爲什麼這種行爲是你的問題?你不能阻止你循環,並等待成功的請求,除非你讓你的請求同步 –

+0

我認爲設置async:false是麻煩,因爲它可能會嚴重凍結瀏覽器,因此我正在尋找一種替代解決方案。 – Leann