完了時に遅延オブジェクトのキューをコールバックするのに問題があります。
次のコードでわかるように、キューを作成しています (この回答に従って: 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);
}
});
}