jQuery ajax:请求失败时调用完成

Ste*_*fan 0 ajax jquery promise

我正在尝试使用promises同步我的ajax请求:我当前的代码很简单:

    var ajax = undefined;

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

                },
                error: function () {

                }

            }).done(function () {
                alert('done');
            });
Run Code Online (Sandbox Code Playgroud)

只要ajax调用成功(状态代码200),但是当调用失败时(例如,显示无效的url),这样就可以正常工作了,不再调用done.即使ajax请求失败,我怎样才能执行完成=

斯特凡

T.J*_*der 5

有几种选择:

成功或失败时调用相同的功能.功能不具有可匿名联定义,你可以用名字分别定义它们,并相应地引用它们.

在你的代码片段,您同时使用旧的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");
}
Run Code Online (Sandbox Code Playgroud)

或使用donefail:

var ajax = undefined;

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

function handler() {
    alert("Done");
}
Run Code Online (Sandbox Code Playgroud)

或者(或组合),有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");
}
Run Code Online (Sandbox Code Playgroud)

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");
}
Run Code Online (Sandbox Code Playgroud)