使用 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 是对回调结果的新承诺,而不是原始承诺。
我正在尝试将一系列模板加载到一个数组中,但在使用 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 是对回调结果的新承诺,而不是原始承诺。