我正在尝试使用.when
和.each
来循环浏览某些元素,并.then
对结果执行某些操作。但我不确定如何存储.when
中要使用.then
的结果。
例如
var widget_data = [];
$.when(
$.each(widget_ids, function(index, widget_id){
$.get('/widget/' + widget_id, function(data){
widget_data.push(data);
});
})
)
.then(function(){
console.log(widget_data);
});
运行后,widget_data数组为空。
答案 0 :(得分:1)
var widget_data = [];
$.when.apply($,
$.map(widget_ids, function(widget_id, index) {
return $.get('/widget/' + widget_id, function(data) {
widget_data.push(data);
});
})
)
.then(function() {
console.log(widget_data);
});
当你使用.each()
时,它返回传递给它的数组,因为它不是一个promise对象,$.when()
会认为它已经解析并将调用then
处理程序无需等待ajax请求完成。
您可以使用$.map()
从源数组创建一个promise对象数组,如上所述可以传递给$.when()
,在这种情况下,只有在所有请求之后才会调用then处理程序已完成 - 但请注意,结果数组中值的顺序可能与源数组中项的顺序不匹配。
答案 1 :(得分:1)
一个问题是when
需要deferered
作为参数,而$.each
不会返回一个参数。
var promises = [];
$.each(widget_ids, function(index, widget_id){
promises.push( $.get('/widget/' + widget_id, function(data){
widget_data.push(data);
}) );
});
$.when.apply($, promises);
.then(function(){
console.log(widget_data);
});