2013-05-09 83 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