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() など、他のさまざまな defer メソッドを試しましたが、コールバックをトリガーするものはないようです。

編集

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 に答える