如何等待所有ajax查询完成(并使用组合结果)

时间:2011-12-17 06:54:49

标签: jquery-ui jquery

var display_message="";
            $('input:checked').each(function(index) {

               var profile_id=$(this).val();
                $.ajax({
                            type: 'post',
                            url: 'myUrl',
                            data: data,
                            success: function(data) {
                                if(data=="ok")
                                    display_message = display_message + data +", ";
                            }
                    });
           });

           alert(display_message);
           alert(display_message);

           if($.trim(display_message)!=""){
                jAlert("Your birthdate already exits in "+display_message.substring(0, display_message.length - 2)+".", "Bdate");
                 return false;
           }

在这段代码中,我使用两个alert-box来显示display_message变量值。 当我成功运行此代码时,在第一个警报框中我得到空白值和第二个警报框我得到我需要的值,然后它将进入条件。 如果我没有使用警告框,则它将始终在display_message变量中取空值,并且永远不会进入if条件。所以我需要更改以运行此代码没有警报框?

3 个答案:

答案 0 :(得分:1)

您正在通过AJAX进行异步调用,但您的代码正在同步执行。所以它在AJAX调用完成之前返回。第一个警报框只是给出了赶上的功能时间。您需要在成功回调中处理所有这些代码。

    var display_message="";
    $('input:checked').each(function(index) {

       var profile_id=$(this).val();
        $.ajax({
                    type: 'post',
                    url: 'myUrl',
                    data: data,
                    success: function(data) {
                        if(data=="ok")
                            display_message = display_message + data +", ";
                        if($.trim(display_message)!=""){
                           jAlert("Your birthdate already exits in "+display_message.substring(0, display_message.length - 2)+".", "Bdate");
         return false;
                    }
            });
   });

答案 1 :(得分:1)

您希望所有ajax查询完成并返回结果,对吗?

然后这是一个同步问题。

我建议采用这种方法(为了清晰起见,代码已经过简化)。

var inputs_processed = -1;
var inputs_to_process = -1;

function queryData() {
  inputs_to_process = $('input:checked').length;

  $('input:checked').each(function() {
    $.ajax({success: function(data) {
      inputs_processed += 1;
      // build up that message
    }});
  });
}

function displayResult() {
  if (inputs_processed == inputs_to_process) {
    // display result
  } else {
    // not all queries finished yet. Wait.
    setTimeout(displayResult, 500);
  }
}

queryData();
displayResult();

基本上,您知道应该发出多少请求,并且在请求数量返回之前您不会显示结果。

答案 2 :(得分:0)

为什么您的数据是“数据”?我不能在这里声明任何称为数据的变量。您应该将要用作参数的值传入数据选项。

编辑:这就是你得到空值的原因。数据没有初始化为任何东西。只有在成功函数之后,您的“数据”将具有该值,因为您声明了具有相同名称的返回值