1

我们都熟悉成功和失败时$.Deferred()行为:

function foo() {
    var backup = 'bar', 
        dfd = $.ajax(...)
        .done(function(data, textStatus, jqXHR) {
            alert(data);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            alert(errorThrown);
        });

    return dfd.promise();
}

// outside the function
$.when(foo())
    .always(function(something) {
        // 'something' is either data, OR jqXHR, depending if the thing fails
    });

但是,我有一个备份结果data,称为backup,驻留在函数内部foo,我想在请求失败时返回它。

假设我既不能更改设置的参数$.ajax(...)(意味着我不能添加“失败”处理程序),也不能更改的返回类型foo,也不能移动backup到外部foo,如何实现以下效果?

function foo() {
    var backup = 'bar',
        dfd = $.ajax(...)
        .done(function(data, textStatus, jqXHR) {
            alert(data);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            // replace return with 'bar', which is impossible 
            // because 'data' is undefined
            data = backup;
        });

    return dfd.promise();
}

// outside the function
$.when(foo())
    .always(function(something) {
        // 'something' is now some fresh data, or 'bar' if ajax fails
    });
4

1 回答 1

1

创建您自己的延迟对象,而不是使用返回的对象$.ajax()

function foo() {
    var def = $.Deferred();
    var backup = 'bar';
    $.ajax(...)
        .done(function(data, textStatus, jqXHR) {
            def.resolve(data);
        })
        .fail(function(jqXHR, textStatus, errorThrown) {
            def.resolve(backup);
        });

    return def.promise();
}

...

foo().done(function(data) {

});
于 2013-09-24T15:47:09.167 回答