我有一个对象数组,我试图对其进行迭代并为列表构建标记。我正在使用一个数组来存储延迟的请求,并在所有请求完成后使用 $.when 将连接的标记注入到 DOM 中。
这是代码:
function populateItemList(items) {
var output = '',
item = null,
template = null,
defers = [];
for (var i = 0, j = items.length; i < j; i++) {
item = items[i];
defers.push(function() {
$.get('/item/' + item.id + '/template')
.done(function(source) {
template = Handlebars.compile(source);
output += template(item);
console.log(item.id + ': done');
})
});
}
$.when.apply(window, defers).done(function() {
$('.itemListContainer').html(output);
$('.itemList a').click(onItemLinkClick);
console.log('when: ' + output);
});
}
但是,我没有任何成功。我遇到了两个问题之一:
- 如果我确实将延迟项目包装在一个函数中(如上面的代码中所示),则不会执行请求,但 $.when会执行。但是由于请求没有被执行,所以输出是空的。
- 如果我不将延迟项目包装在函数中,则请求会被执行(正确的次数,但记录到控制台的 item.id 始终是最后一个项目的 id),而 $.when不会被执行。
我知道这与这个问题非常相似,我正在使用该代码作为我的基础,但我仍然遇到这些问题。有任何想法吗?