等待AJAX​​调用(POST)完成

时间:2010-09-14 21:22:25

标签: jquery ajax post

我正在使用jQuery UI选项卡,其中每个选项卡上都有不同的表单。在用户输入各种数据后,他们提交整个选项卡集,以便每个选项卡异步发布到服务器。这很好用,我在这里没有问题。

但是,遇到问题的是,我发布的最后一个表单必须在所有其他帖子完成后发生。一般的想法是这样的:

postForm(0, "#Form1");
postForm(1, "#Form2");
postForm(2, "#Form3");
postForm(3, "#Form4");
$.post('Project/SaveProject', function (data) {
    $('<div class="save-alert">The current project has been saved.</div>')
    .insertAfter($('#tabs'))
    .fadeIn('slow')
    .animate({ opacity: 1.0 }, 3000)
    .fadeOut('slow', function () {
        $(this).remove();
    });
});

postForm函数执行一些处理,然后进行AJAX $ .post调用。这里执行的最后一个$ .post(到'Project / SaveProject')必须等到其他帖子完成。这样做的最佳方法是什么?

4 个答案:

答案 0 :(得分:15)

你可以使用在所有其他AJAX POST结束时触发的.ajaxStop()事件,假设你没有做其他的AJAX工作,那样:

postForm(0, "#Form1");
postForm(1, "#Form2");
postForm(2, "#Form3");
postForm(3, "#Form4");
$(document).ajaxStop(function() {
  $.post('Project/SaveProject', function (data) {
    $('<div class="save-alert">The current project has been saved.</div>')
    .insertAfter($('#tabs'))
    .fadeIn('slow')
    .animate({ opacity: 1.0 }, 3000)
    .fadeOut('slow', function () {
      $(this).remove();
    });
  });
  $(this).unbind('ajaxStop');
});
.ajaxStop()所有正在运行的 AJAX请求完成时触发,因此只有在所有这些POST返回时才会触发,jQuery会保持计数内部(jQuery 1.5中的$.active$.ajax.active)确定有多少同时发生的AJAX请求...当它返回0时,此事件将触发。

此方法允许您同时执行其他表单提交,并在ASAP之后尽快完成最终表单。

答案 1 :(得分:5)

您总是可以使用类似

的内容使所有帖子同步

$.ajax({
   type: "POST",     
   async: false,
   url: "",
   ...

当然它不会那么快但如果$(document).ajaxStop不是一个选项它确实可以解决你的问题

答案 2 :(得分:2)

回调:

定义postForm以进行回调:

function postForm(ind, id, callback)
{
  // ...
  $.post(url, function()
  {
    // ...
    callback();
  });
}

然后做类似下面的事情。您可以使用递归以较不硬编码的方式编写它,如果有更多表单,这可能特别有用。

postForm(0, "#Form1", function()
{
    postForm(1, "#Form2", function()
    { 
        postForm(2, "#Form3", function()
        {
            postForm(3, "#Form4", function()
            {
                $.post('Project/SaveProject', function (data) {
                    $('<div class="save-alert">The current project has been saved.</div>')
                        .insertAfter($('#tabs'))
                        .fadeIn('slow')
                        .animate({ opacity: 1.0 }, 3000)
                        .fadeOut('slow', function () {
                            $(this).remove();
                        });
                });
            });
        });
    });
});

答案 3 :(得分:0)

ajaxStop的问题在于每次完成任何ajax时都会触发。另一种方法是实现自己的方法堆栈,如下所示:

var stack = []
postForm(var1, var2){
    stack.push(1);
    //Do postForm stuff
    stack.pop();
    if (stack == undefined){
        //Call the last post method
    }
}
postForm(0, "#Form1");
postForm(1, "#Form2");
postForm(2, "#Form3");
postForm(3, "#Form4");
$.post('Project/SaveProject', function (data) {
    $('<div class="save-alert">The current project has been saved.</div>')
    .insertAfter($('#tabs'))
    .fadeIn('slow')
    .animate({ opacity: 1.0 }, 3000)
    .fadeOut('slow', function () {
        $(this).remove();
    });
});