在jQuery中将数据从.when传递给.then

时间:2016-01-25 03:54:04

标签: jquery promise .when

我正在尝试使用.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数组为空。

2 个答案:

答案 0 :(得分:1)

您需要使用.map()而不是.each()

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);
});