【问题标题】:jQuery ajax: call done when request failsjQuery ajax:请求失败时调用完成
【发布时间】:2013-02-26 17:19:54
【问题描述】:

我正在尝试使用 Promise 同步我的 ajax 请求: 我当前的代码就是这么简单:

    var ajax = undefined;

    $.ajax({
                type: 'put',
                url: url,
                data: data,
                cache: false,
                successs: function () {

                },
                error: function () {

                }

            }).done(function () {
                alert('done');
            });

只要 ajax 调用成功(状态码 200),它就可以正常工作,但是当调用失败(例如,无效的 url)时,不再调用 done。 即使ajax请求失败,我如何执行完成=

斯蒂芬

【问题讨论】:

  • 你可以尝试使用.complete回调,无论ajax请求失败还是成功都会执行。
  • 不管怎样,你拼错了success。非常sssibilantly。
  • 我在哪里拼错了success?

标签: jquery ajax promise


【解决方案1】:

几个选项供您选择:

在成功或失败时调用相同的函数。函数必须是匿名的和内联定义的,你可以用名字单独定义它们并相应地引用它们。

在您的 sn-p 中,您同时使用旧的 success(尽管末尾有一个额外的 s)和 error 新的 done,它意味着您定义了两个不同的成功回调(successdone)。一个就够了。

这是一个使用successerror 的示例,将null 传递给error 上的处理程序:

var ajax = undefined;

$.ajax({
    type:    'put',
    url:     url,
    data:    data,
    cache:   false,
    success: handler,
    error:   function() {
        handler(null);
    }
});

function handler() {
    alert("Done");
}

或者使用donefail

var ajax = undefined;

$.ajax({
    type:    'put',
    url:     url,
    data:    data,
    cache:   false
}).done(handler).fail(function() {
    handler(null);
});

function handler() {
    alert("Done");
}

交替(或组合)有complete 回调(您在选项中指定的那个)和always 回调(在donefail 样式中),无论成功或失败(成功或失败回调完成后):

complete:

var ajax = undefined;

$.ajax({
    type:    'put',
    url:     url,
    data:    data,
    cache:   false,
    success: handler,
    error:   function() {
        handler(null);
    },
    complete: function() {
        alert("Always called (after success/error)");
    }
});

function handler() {
    alert("Done");
}

always:

var ajax = undefined;

$.ajax({
    type:    'put',
    url:     url,
    data:    data,
    cache:   false
}).done(handler).fail(function() {
    handler(null);
}).always(function() {
    alert("Always called (after done/fail)");
});

function handler() {
    alert("Done");
}

【讨论】:

  • 天哪,你是怎么写的... +1 by me :D
  • 一直是函数,我一直在寻找。
  • @Stefan:很酷,很高兴有帮助!这部分的文档在这里:api.jquery.com/jQuery.ajax/#jqXHR
【解决方案2】:

您可以使用complete 设置代替done 功能:

$.ajax({
    type: 'put',
    url: url,
    data: data,
    cache: false,
    successs: function () {

    },
    error: function () {

    }
    complete: function(jqXHR, textStatus) {
        alert("Done");

});

complete 函数在successerror 之后执行。请查看jQuery ajax 文档了解更多详情。

如果您不关心实际的 successerror 回调,并且只想在调用完成后执行某些操作,而不管结果如何,则完全省略 successerror 设置。

【讨论】:

  • 要求解释否决票可能不会引起任何回应。
  • @Alison Someobdy 否决了我的回答,我很好奇为什么。
【解决方案3】:

没有必要完成

 $.ajax({
    type: 'post',
    url: url,
    data: data,
    cache: false,
    success: function () {
       alert('success');
    },
    error: function () {
       alert('error');
    },
    complete: function(){
       alert('complete');
    }
 });

【讨论】:

  • 不,我想你没有
猜你喜欢
  • 2013-04-26
  • 2019-06-08
  • 2015-04-07
  • 2016-06-08
  • 1970-01-01
  • 1970-01-01
  • 2013-12-06
  • 1970-01-01
相关资源
最近更新 更多