2013-01-08 118 views
4

我想調用一個循環內的多個API(例如:$ .each)。我可以使用async:false模式執行此操作,但會使腳本滯後。如何在同步模式下實現這一點?只要忽略async選項,只會將list中的最後一個元素髮送到api調用。JQuery中每個循環內的多個異步Ajax調用

$.each(lists, function(index, value) { 

      channel = lists[index].channel; 
      list = lists[index].list; 

      $.ajax({ 
       url : 'api.php?list=' + list + '&from=' + from + '&to=' + to, 
       dataType : 'json', 
       async : false, 
       success : function(data) { 
        obj = data; 

        $.ajax({ 
         url : 'api.php?list=' + list + '&from=' + from + '&to=' + to + '&action=sender', 
         dataType : 'json', 
         async : false, 
         success : function(data) { 

          obj['senders'] = data.msg; 
          CommonContainer.inlineClient.publish(channel, obj); 

         } 
        }); 

       } 
      }); 

     }); 
+1

http://stackoverflow.com/questions/13250746/process-chain-of-functions-without-ui-塊/ 13252018#13252018 – slebetman

+0

你的意思是什麼讓只有最後一個發送到API調用?看_.after可能是有用的,你可以創建一個函數,它會被調用X次後運行。如果我正在製作5個AJAX調用並希望某些內容能夠成功運行,那麼我會使用它。 - 如果你想要一個例子讓我知道,我可以一起扔 –

+1

我不同意重複。這裏的問題是一個聲明bug使關閉無法保護變量。 –

回答

5

這是因爲channellist是全球性的(或者宣告出局傳遞給$.each功能的範圍),因此不被封閉保護。

使用此:

var channel = lists[index].channel; 
    var list = lists[index].list; 

你也應該申報obj作爲

var obj = ...