为什么 AJAX 完成和错误回调都触发了

Why are AJAX complete and error callbacks both firing?

本文关键字:回调 错误 AJAX 为什么      更新时间:2023-09-26

这是一个带有匿名回调的简单AJAX请求。completeerror都在开火。为什么?

$.ajax({
  url:'/echo/js/?js=hello%20world!',
  complete: function (response) {
    console.log("In anonymous success callback");
    console.log("response text: " + response.responseText);
    console.log("response object:");
    console.log(response);
  },
  error: function (error) {
    console.log("In anonymous error callback");
    console.log("error object:");
    console.log(error);
  }
});

https://jsfiddle.net/abalter/tz0tu04y/

编辑我尝试使用承诺,现在我只得到错误。我的"简单"ajax一定有问题。

$.ajax({
    url: '/echo/js/?js=hello%20world!',
    type: 'POST',
  })
  .done(function(response) {
    console.log("In anonymous JS success callback");
    console.log("response text: " + response.responseText);
    console.log("response object:");
    console.log(response);
  })
  .fail(function(error) {
    console.log("In anonymous JS error callback");
    console.log("error object:");
    console.log(error);
  })
  .always(function(data) {
    console.log("JS I will always do this");
    console.log(data);
  });

https://jsfiddle.net/abalter/bjwc1dx1/

来自 jQuery 的 ajax() 文档:

完成

请求完成时要调用的函数(成功和 执行错误回调)

现在,对于现代版本的jQuery,侦听成功和错误的首选方法是使用promise接口。

$.ajax(...)
   .done( function() {})     //success
   .fail( function() {})     //error
   .always( function() {});  //complete

完成并不等同于成功。无论状态如何,当响应返回时都会触发。

更新以回答您的第二个问题:

你在第二个小提琴的第一部分收到错误的原因是它期待javascript,并且你给出的文本不是有效的javascript。

如果您将其发送到您的格式有效的端点,或者将您的 hello world 放在引号中(使其有效 javascript),它将起作用。

配置 AJAX 请求时,可以设置多个选项,其中包括定义 beforeSend、成功、错误和完成事件的回调。如果选中此 http://api.jquery.com/jquery.ajax/您将看到为成功和错误事件调用了完整的回调。干杯