【问题标题】:Use success() or complete() in AJAX call在 AJAX 调用中使用 success() 或 complete()
【发布时间】:2009-06-20 06:09:25
【问题描述】:

我想了解下面的AJAX调用,就complete()方法而言;

当我用success() 替换complete() 时,我得到一个空的responseText,就像使用AJAX 的error() 方法一样。

另一方面,当我将 complete() 方法保留原样时,一切都按预期工作。

是不是success()complete()早返回?

$("#formnaw").submit(function() {
  var fnc = invoerFnc.attr("value");
  var vnaam = invoerVnaam.attr("value");
  var anaam = invoerAnaam.attr("value");
  var str1 = invoerStr1.attr("value");
  var nr1 = invoerNr1.attr("value");
  var pc1 = invoerPc1.attr("value");
  var pl1 = invoerPl1.attr("value");
  var tel1 = invoerTel1.attr("value");
  var mob1 = invoerMob1.attr("value");
  var em1 = invoerEm1.attr("value");
  var goknop = $("#formnaw > .instelling_go");
  //we deactiveren de submit knop tijdens het verzenden 
  goknop.attr({
    disabled: true
  });
  goknop.blur();
  //stuur de post variabelen naar livetabs.php
  $.ajax({
    type: "POST",
    url: "registraties/instellingenact.php",
    data: "actie=wijzignaw&vnaam=" + vnaam + "&anaam=" + anaam + "&functie=" + fnc + "&straat=" + str1 + "&nr=" + nr1 + "&postcode=" + pc1 + "&plaats=" + pl1 + "&tel=" + tel1 + "&mob=" + mob1 + "&email=" + em1,
    timeout: 5000,
    success: function(data, textStatus) {
        alert('bij success');
        //doe iets
      } //EINDE success
      ,
    error: function(XMLHttpRequest, textStatus, errorThrown) {
        if (textStatus == 'timeout') {
          //doe iets
        } else if (textStatus == 'error') {
          //doe iets
        }
        //her-activeer de zend knop
        goknop.attr({
          disabled: false
        });
      } //EINDE error
      ,
    complete: function(data) {
        updatelijst.append(data.responseText + "<br>");
        if (data.responseText.indexOf("Fout") != -1) {
          $('#formnaw').find('td.foutnr1').prepend(data.responseText);
        } else {
          updatelijst.animate({
            opacity: 'show'
          }, 1000, function() {});
        }
        //her-activeer de zend knop
        goknop.attr({
          disabled: false
        });
      } //EINDE complete
  }); //EINDE ajax
  //we stoppen het standaard gedrag van een submit, zodat de pagina niet wordt vernieuwd.
  return false;
});

【问题讨论】:

    标签: jquery ajax


    【解决方案1】:

    是不是success()complete()早返回?

    是的; AJAX success() 方法在 complete() 方法之前运行。

    下图是流程示意图:

    需要注意的是

    • success()(本地事件)仅在请求成功(服务器没有错误,数据没有错误)时调用。

    • 另一方面,无论请求是否成功,都会调用complete()(本地事件)。即使是同步请求,您也将始终收到完整的回调。

    ...关于 AJAX 事件的更多详细信息here

    【讨论】:

      【解决方案2】:

      completesuccesserror 回调执行后执行。

      也许您也应该检查第二个参数complete 提供的信息。它是一个字符串,包含 ajaxCall 的成功类型。

      这里jQuery.ajax( options )更详细地描述了不同的回调


      我猜你错过了 completesuccess 函数(我知道 API 不一致)传入不同的数据这一事实。success 只获取数据,complete 获取整个 XMLHttpRequest 对象.当然数据字符串上没有responseText属性。

      因此,如果您将complete 替换为success,您也只需将data.responseText 替换为data

      成功

      函数通过两次 参数:从返回的数据 服务器,格式根据 'dataType' 参数和一个字符串 描述状态。

      完成

      函数通过两次 参数: XMLHttpRequest 对象 和一个描述类型的字符串 请求成功。

      如果您需要在成功回调中访问整个 XMLHttpRequest 对象,我建议您尝试一下。

      var myXHR = $.ajax({
          ...
          success: function(data, status) {
              ...do whatever with myXHR; e.g. myXHR.responseText...
          },
          ...
      });
      

      【讨论】:

      • 哎呀,评论同时出现所以,如果我做对了。完整的功能包含我需要的所有信息。除非您在函数中传递两个参数,否则成功包含较少。我希望我不会变得愚蠢,但是就像我一直使用的那样完整吗?还是说成功更轻??
      • 除了我最后的评论之外,我上面的代码是否仍然会出现错误。简而言之,如果我省略了成功选项,它会做所有事情而没有任何缺点。对不起,如果听起来我还不明白。这让我有点困惑。
      • 我编辑了我的问题以包含我使用的完整代码它没有给出任何错误,但我可能会删除成功选项。如果结果相同。
      • complete 获取整个 XMLHttpRequest 对象。成功获取 XMLHttpRequest.responseText 属性的内容。您上面的代码也应该在没有成功回调的情况下工作,没有任何副作用,因为它什么都不做。但是使用success或complete是有区别的。只有在请求成功完成时才会调用 Success。但是完整的回调会在成功和错误时触发。查看docs.jquery.com/Ajax_Events 以更好地了解 jquery 以何种顺序以及在何种情况下执行哪些回调
      【解决方案3】:

      “完成”在 ajax 调用完成时执行。当 ajax 调用以成功的响应代码结束时执行“success”。

      【讨论】:

      • 谢谢,但要清楚,我是否必须使用代码在完整选项下执行而不是在成功下执行。错误选项是否也可以单独与完整选项一起使用?
      • 或者,提示我没有收到成功响应码,奇怪?
      【解决方案4】:

      好吧,从隔离区来说,$.ajax 中的 complete() 就像 try catch 块中的 finally

      如果您在任何编程语言中使用 try catch 块,无论您是成功执行某件事还是在执行过程中出错都没有关系。 finally{} 块将始终被执行。

      $.ajax 中的complete() 也是如此,无论您收到success() 响应还是error(),一旦执行完成,总是会调用complete() 函数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 1970-01-01
        • 2012-09-26
        • 1970-01-01
        相关资源
        最近更新 更多