0

我无法让延迟对象队列在完成后回调。

正如您在以下代码中看到的那样,我正在创建一个队列(根据此答案: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);
        }
    });
}
4

1 回答 1

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;
    }
}
于 2013-05-09T10:43:13.223 回答