使用$ .ajax执行异步请求

时间:2010-11-30 16:38:49

标签: jquery jquery-selectors

我们知道只有同步请求是使用$ .ajax完成的,并且选项为async:false 但我在Jquery手册中看到过“同步请求可能会暂时阻止浏览器 在请求处于活动状态时禁用任何操作“。我有一些问题,例如

我看到一些答案说要使用callback()How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?。 我该如何实现这个功能呢?

在下面的函数中如果请求失败或者响应没有返回我如何处理它。我的意思是我可以使用“错误:”或类似的东西。 如何有效地改进这个功能我的意思是使用回叫和错误处理。据说(我们永远不会有错误和成功回复请求)

function empvalidate() {
          var exists = false;             // default return value is false
          var empno = $("#empno").val();
          if (empno != '') {
            $.ajax({
              url: "emp.php",
              async: false,
              dataType: "json",
              data: {'param1': $("#param1").val(), 'empno': $("#empno").val()},
              success: function (data) {
                exists = data.status;     // set status of existence to outer variable
              }
            });
          }
          return exists;                  // return actual value
        }

3 个答案:

答案 0 :(得分:2)

您的同步请求将导致UI线程(以及浏览器)等待XMLHttpRequest对象返回(无论是失败还是成功,都会有种类)。

jQuery将执行您的成功/完成和错误处理程序,就像您使用“正常”异步请求时执行的那样。但它会在它出现之前等待/阻止。

因此,最糟糕的情况是,实际请求需要花费大量时间。网络latencys在这种情况下非常糟糕,数据量很大......所有这些都将完全锁定你的UI线程,这显然是一个令人敬畏的用户期限。

我真的不知道现在有人应该使用同步的ajax请求。

答案 1 :(得分:0)

而不是使用async: false,你最好做这样的事情:

function begin_ajax() {
    // Set your UI states here
}

function success_ajax(data) {
    // Run whatever needs to run if the request is successful.
}

function error_ajax(xhr, error_type, msg) {
    // Display error messages
}

function complete_ajax() {
    // Clean up UI
}
$.ajax({
    beforeSend: begin_ajax,
    success: success_ajax,
    error: error_ajax,
    complete: complete_ajax
    // Your parameters here
});

答案 2 :(得分:0)

使用完整功能并为“超时”提供案例

来自jQuery Docs

  

完成(XMLHttpRequest的,   textStatus) - 功能

     

一个功能   请求完成时调用   (在成功和错误回调之后   执行)。该函数被传递   两个参数:XMLHttpRequest   对象和分类的字符串   请求的状态(“成功”,   “notmodified”,“error”,“timeout”或   “parsererror”)。这是一个Ajax事件。

所以Code在你的ajax上看起来像这样:

function empvalidate() {
      var exists = false;             // default return value is false
      var empno = $("#empno").val();
      if (empno != '') {
        $.ajax({
          url: "emp.php",
          async: false,
          dataType: "json",
          data: {'param1': $("#param1").val(), 'empno': $("#empno").val()},
          success: function (data, ts) {

              if(ts == "success")
                   exists = data.status; // set status of existence to outer variable
              else if(ts == "timeout")
              {
                   $(document).trigger('customTimeoutHandler');
              }
          }
        });
      }
      return exists;                  // return actual value
    }

此处不确定应用程序,但请记住,您也可以在此处设置自定义超时变量。不太确定你想要它是什么,它只取决于你的情况。