2013-02-21 40 views
0

我想調用一個頁面上每個選定複選框的ajax函數。一旦所有這些ajax調用完成,我想要做其他事情。在下面的示例中,在完成任何「單個呼叫」文本之前,將「全部呼叫完成」文本寫入控制檯。我如何等待所有ajax調用完成?謝謝!!jQuery延期循環

function ajax_function() { 
    return $.ajax({ 
    url: "submit.php", 
    type: "POST", 
    dataType: "json", 
    data: form_data, 
    cache: false 
    }) 
} 

var deferreds = $('input:checkbox:checked.checkprint').map(function(i, elem) { 
    $.when(ajax_function()).then(function(data) { 
    console.log('single call completed'); 
    return data; 
    }); 
}); 

$.when.apply($, deferreds.get()).done(function() { 
    console.log('all calls completed'); 
}); 
+1

IMO這是在每一個複選框,點擊發送數據的壞主意,你可以當用戶點擊這個按鈕讀放一個按鈕,所有這些值並將其發送到服務器。 – 2013-02-21 04:51:12

回答

0

我想我完成我試圖用ajaxStop(http://api.jquery.com/ajaxStop/

$(document).delegate('#submit_all', 'click', function(e) { 
    $('input:checkbox:checked.checkprint').each(function() { 
    ajax_function(); 
    }); 
    $("#submit_all").one("ajaxStop", function() { 
    console.log('all calls completed'); 
    }); 
}); 
1

您可以使您的ajax調用同步。

function ajax_function() { 
    return $.ajax({ 
    url: "submit.php", 
    type: "POST", 
    dataType: "json", 
    data: form_data, 
    cache: false, 
    async:false 
    }) 
} 

選項2:

var totalnumber = $('input:checkbox:checked.checkprint').length; 
var counter = { t: 0 }; 
var deferreds = $('input:checkbox:checked.checkprint').map(function(i, elem) { 
    $.when(ajax_function(totalnumber,counter)).then(function(data) { 
    console.log('single call completed'); 
    return data; 
    }); 
}); 

function ajax_function(totalnumber,counter) { 
    return $.ajax({ 
    url: "submit.php", 
    type: "POST", 
    dataType: "json", 
    data: form_data, 
    cache: false, 

    }).done(function(html) { 
    counter.t++; 
    if (counter.t == totalnumber) { 
     console.log('all calls completed'); 
    } 
    }); 
} 

爲什麼counter.t,因爲對象是作爲參考過去了,我們需要改變counter.t的價值。

+0

這可行,但我希望他們都在同一時間開火。當我更改爲異步:false時,它會在繼續前等待每個調用完成。我希望他們都能一起開始,一旦所有人都完成了繼續。 – 2013-02-21 05:01:22