2013-05-09 113 views
0

我在遇到延遲對象的隊列以完成回調時遇到問題。jQuery延遲隊列沒有回電

正如你在下面的代碼中看到的,我創建了一個隊列(根據這個答案:JQuery - $.when syntax for array of Deferred objects),但是不幸的是答案不包括doSomeWork函數的內容。據推測,我需要調用defer.resolve(),因爲我在下面做。

_getTagLabels: function(tags, callback){ 
     var self = this;   

     var queue = []; 

     for (i = 0; i < tags.length; i++) { 
      var tag = tags[i]; 

      queue.push(new $.Deferred(

        function (defer){ 
         self.getLabel(tag.id, function(label) { 
          tag.label = label; 
          defer.resolve(); 
         }) 
        } 

       ).promise() 
      ); 
     } 

     $.when.apply(undefined, queue).then(function(){ 
      callback(); 
     });    
    } 

但是,回調從未達到。儘管defer.resolve()中的斷點正在被命中並且正在設置標籤標籤。我嘗試了其他各種延遲方法,比如done()和then(),但沒有一個可以觸發回調。

編輯

這裏的getLabel和getConcept:

getLabel: function(id, callback) { 
    var self = this; 

    self.getConcept(id, function(concept){ 
     callback(concept.label); 
    }); 
} 

getConcept: function(id, callback){ 
    var self = this; 

    // abort any current queries. 
    if (self.getConceptXHR) self.getConceptXHR.abort(); 

    var url = String.format(self.options.conceptTemplate, self.options.serviceEndpointUrl, id); 

    self.getConceptXHR = $.ajax({ 
     dataType: "jsonp", 
     url: url, 
     success: function (response) { 
      callback(response); 
     } 
    }); 
} 
+0

又是什麼getLabel()呢? – adeneo 2013-05-09 10:15:23

+0

我已將它們添加到問題 – user2365778 2013-05-09 10:31:32

+0

這些問題似乎沒有問題,因爲它們正在返回標籤數據,並且defer.resolve()正在被擊中..? – user2365778 2013-05-09 10:38:38

回答

0
var obj = { 
    _getTagLabels: function(tags, callback){ 
     var self = this, 
      queue = []; 

     for (i = 0; i < tags.length; i++) { 
      (function(y) 
       queue.push(
        self.getLabel(tag.id).done(function(result) { 
          tags[y].label = result.label; 
        }); 
       ); 
      })(i); 
     } 

     $.when.apply($, queue).done(callback); 
    }, 
    getLabel: function(id){ 
     if (this.getConceptXHR) this.getConceptXHR.abort(); 
     var url = String.format(this.options.conceptTemplate, this.options.serviceEndpointUrl, id); 

     this.getConceptXHR = $.ajax({ 
      dataType: "jsonp", 
      url: url 
     }); 
     return this.getConceptXHR; 
    } 
} 
+0

我不得不改變它的運行語法,但回調仍然沒有被調用。 不確定你爲什麼要封裝queue.push中的自動執行匿名函數? 如果我把這個函數放在queue.push中,它會在回調被觸發後執行...... – user2365778 2013-05-09 12:06:13

+0

關鍵是通過返回它來使用$ .ajax中的內置函數,而不是創建新的deferred並使用回調函數。額外的功能是一個閉包,以保持我的價值,因爲getLabel()函數是異步的。我看到的唯一問題是中止任何正在進行的ajax調用,因爲這樣做會導致進行多次調用並將它們存儲在一個數組中,因爲只有循環中的最後一個ajax調用將完成,其他調用將會中止每個後續的迭代。 – adeneo 2013-05-09 13:56:34

+0

我結束了使用另一個Ajax服務一次返回所有的標籤。感謝您的幫助。 – user2365778 2013-05-09 14:02:01