在$ .when .done之外的ajax中添加对象

时间:2015-05-05 15:34:43

标签: javascript jquery ajax

function ajaxCall1(){
    return $.ajax({
        url : 'URL1',
        data : { id : id },
        type : 'GET',
    });
}
function ajaxCall2(item_id)
{
    return $.ajax({
        url: 'URL2',
        data: { item_id: item_id },
        dataType: "text",
        type: 'GET',
    });
}

$.when(ajaxCall1()).done(function(columns){
    $.each(columns, function(column, rows) {
        $.each(rows, function(i, row) {
            $.each(row.items, function(i, item) {
                $.when(ajaxCall2(item.id)).done(function(count){
                    item.counter = count;
                });
                console.log(item);
            });
        });
    });
});

我需要从调用item中获取一个新对象{counter:count},该对象是对象row的嵌套部分。我不知道如何将对象从$.when...});

推送到项目中

2 个答案:

答案 0 :(得分:1)

这是你需要的:

ajaxCall1().done(function(columns){ // do first ajax

    var promiseArray =[]; // array for promises of subsequent ajax calls
    $.each(columns, function(column, rows) {
        $.each(rows, function(i, row) {
            $.each(row.items, function(i, item) {
                 // each call returns a promise...and also has it's own "done" to update count               
                 var promise =  ajaxCall2(item.id).done(function(count){
                    item.counter = count;
                });
                // push each promise returned from `$.ajax` into array              
                promiseArray .push(promise);                
            });
        });
    });
    // all calls will be completed, can do something with main columns array
    $.when.apply($, promiseArray).done(function(){
        /// do something with columns
    });
});

答案 1 :(得分:1)

您希望$.when暂停执行直到完成,但事实并非如此。执行将在$.when之后立即继续执行,并且只有在完成后才会执行回调。

如果要在完成所有ajax调用时进行回调,可以将它们添加到数组中,并在延迟数组上使用最终$.when

var deferreds = [];
$.when(ajaxCall1()).done(function(columns){
    $.each(columns, function(column, rows) {
        $.each(rows, function(i, row) {
            $.each(row.items, function(i, item) {
                var d = ajaxCall2(item.id);
                deferreds.push(d);

                $.when(d).done(function(count){
                    item.counter = count;
                });
            });
        });
    });
});

$.when.apply(null, deferreds).done(function(){
    console.log( 'All ajax calls are done and each item should have a counter property' );
});