【问题标题】:Two ajax requests on same event at same time . what should be the typical behaviour? how it is different if request is synchronous同时针对同一事件的两个 ajax 请求。典型的行为应该是什么?如果请求是同步的,会有什么不同
【发布时间】:2014-04-10 12:35:11
【问题描述】:

在下面的 javascript 代码中,我同时发送了两个 Ajax 请求。
在使用 Firebug 进行分析后,我得出了一个不同寻常的结论:
“哪个(Ajax)响应最先出现,最后打印”

问题 2: 如果我将 Ajax url 目标分配给随机字符串(比如“abcd”)[不存在],那么 ajax 调用的总数将增加到 3?

$(document).ready(function(e) {

  $("form[ajax=true]").submit(function(e) {

    e.preventDefault();

    var form_data = $(this).serialize();
    var form_url = $(this).attr("action");
    var form_method = $(this).attr("method").toUpperCase();

    $("#loadingimg").show();

    $.ajax({
      url: form_url, 
      type: form_method,      
      data: form_data,     
      cache: false,
      success: function(returnhtml){                          
        alert ("a");
        // $("#result").html(returnhtml); 
        // $("#loadingimg").hide();                    
      }           
    });   

    $.ajax({
      url: form_url, 
      type: form_method,      
      data: form_data,     
      cache: false,
      success: function(returnhtml){                          
        // $("#duplicate").html(returnhtml); 
        // $("#loadingimg").hide();
        alert("b");
      }           
    }); 
  });
});

请参考以下Fiddle

【问题讨论】:

  • "which ever (ajax)response is coming first is printing last" - 也许,也许不是。在您的特定情况下,这可能确实是大多数情况下的结果。根据定义,AJAX 是异步的。无法保证哪个会先“完成”(或根本不会)。 “问题2”没有多大意义,你能详细说明一下吗?事实上,你的问题是什么?
  • 你需要它们以特定的顺序发生吗?
  • 我无法确认。使用小提琴http://jsfiddle.net/d66DN/ 您可以先看到第一个返回警报。此外,如果您向随机 url 发出请求,您会得到 301:premanently removed。如果您只更改一个网址,您将获得 3,同时更改您将获得 4。
  • @David 你可以通过运行 firebug 工具来确认。

标签: javascript jquery ajax frontend


【解决方案1】:

Gaurav,你有一个错误,在第一个 $.ajax 的末尾,它必须以 ), 和第二个 ) 结尾。

你不能以;结束

var result1;
var result2;
$.when(
    $.ajax({ // First Request
        url: form_url, 
        type: form_method,      
        data: form_data,     
        cache: false,
        success: function(returnhtml){     
                result1 = returnhtml;                  
        }           
    }),

    $.ajax({ //Seconds Request
        url: form_url, 
        type: form_method,      
        data: form_data,     
        cache: false,
        success: function(returnhtml){                          
            result2 = returnhtml;     
        }           
    })

).then(function() {
    $('#result1').html(result1);
    $('#result2').html(result2);
});

【讨论】:

    【解决方案2】:

    我不确定我是否完全理解,但我会尽力为您提供一些信息。正如大卫所说,第一个请求似乎是最后一个响应,但在许多情况下会有所不同。您可以通过多种方式来控制请求的结果或顺序。

    1) 第一个请求成功后,您可以发起第二个请求。出于速度目的,我不建议这样做,因为您的请求不是并行运行的。

    $.ajax({ // First Request
        url: form_url, 
        type: form_method,      
        data: form_data,     
        cache: false,
        success: function(returnhtml){     
            $.ajax({ //Seconds Request
                url: form_url, 
                type: form_method,      
                data: form_data,     
                cache: false,
                success: function(returnhtml){                          
                   // $("#duplicate").html(returnhtml); 
                   // $("#loadingimg").hide();
                    alert("b");
                }           
            }); 
           alert ("a");
           // $("#result").html(returnhtml); 
           // $("#loadingimg").hide();                    
           }           
        });   
    

    2) 如果您需要同时获得两个请求响应,首选方法可能是 jQuery deferred。这将使两个请求并行运行,一旦收到两个响应,您就可以继续进行。

    类似这样的:

    var result1;
    var result2;
    $.when(
        $.ajax({ // First Request
            url: form_url, 
            type: form_method,      
            data: form_data,     
            cache: false,
            success: function(returnhtml){     
                    result1 = returnhtml;                  
            }           
        }); 
    
        $.ajax({ //Seconds Request
            url: form_url, 
            type: form_method,      
            data: form_data,     
            cache: false,
            success: function(returnhtml){                          
                result2 = returnhtml;     
            }           
        }); 
    
    ).then(function() {
        $('#result1').html(result1);
        $('#result2').html(result2);
    });
    

    签出:

    https://api.jquery.com/jQuery.when/

    http://api.jquery.com/deferred.then/

    https://api.jquery.com/deferred.done/

    我希望这会有所帮助!

    【讨论】:

    • 这是否有助于或回答您的任何问题?
    【解决方案3】:

    或者在你的代码中使用server_response。脚本以条件开头:

    if (recherche1.length>1) {
        $.ajax({ // First Request
            type :"GET",
            url : "result.php",
            data: data,     
            cache: false,
            success: function(server_response){     
                $('.price1').html(server_response).show();                  
            }           
        }),
    
        $.ajax({ //Seconds Request
            type :"GET",
            url : "result2.php",
            data: data,     
            cache: false,
            success: function(server_response){                          
                $('.price2').html(server_response).show();      
            }           
        });
    }
    

    【讨论】:

      【解决方案4】:
      var result1;
      var result2;
      $.when(
          $.ajax({ // First Request
              url: form_url, 
              type: form_method,      
              data: form_data,     
              cache: false,
              success: function(returnhtml){     
                      result1 = returnhtml;                  
              }           
          }); 
      
          $.ajax({ //Seconds Request
              url: form_url, 
              type: form_method,      
              data: form_data,     
              cache: false,
              success: function(returnhtml){                          
                  result2 = returnhtml;     
              }           
          }); 
      
      ).then(function() {
          $('#result1').html(result1);
          $('#result2').html(result2);
      });
      

      【讨论】:

      • 你好 Gaurav,你给出的例子已经 wrxsti 回答了同样的例子
      猜你喜欢
      • 2017-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-10
      相关资源
      最近更新 更多