使用 jQuery 时使用 promises 数组

Using jQuery when with array of promises

我正在尝试将一系列模板加载到一个数组中,但在使用 jQuery 的 when 方法时遇到了一些问题(基于 this answer

var files = [/*array of file names*/];
var templates = [];
files.forEach(function(file){
    templates.push(
        $.get('/temps/' + file + '.hbs').then(function(temp) {
            console.log('done loading', temp);
        })
    )
});
$.when.apply($, templates).then(function() {
    console.log(arguments); //"undefined"x10
});

为什么给 when 的承诺数组不生成我的十个模板的数组?这里出了什么问题?

编辑: 显然,在每个 get 中丢弃 then 方法让我更接近一点:

templates.push($.get('/temps/' + file + '.hbs'));

但是我很好奇什么时候我不能在这里使用 then 以及什么时候

templates.push($.get('/temps/' + file + '.hbs')[0]) 

仍然给我一个 undefined 的数组。返回数组中的第一个元素是返回的数据。为什么推送第一个元素不起作用?

您正在调用 then,returns 是另一个承诺。如果您只想要 "side effect",请改用 done

因为数组中的承诺是 undefined 的承诺,而不是您的模板的承诺。您需要使用

$.get('/temps/' + file + '.hbs').then(function(temp) {
    console.log('done loading', temp);
    return temp;
//  ^^^^^^
})

为模板获取承诺,否则它会使用隐式 return 值 undefined 解析。请记住,then return 是对回调结果的新承诺,而不是原始承诺。