延迟失败时返回备份

时间:2013-09-24 15:41:58

标签: jquery ajax jquery-deferred

成功并失败时,我们都熟悉the $.Deferred() behaviour

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之外{1}},我怎样才能达到以下效果?

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
    });

1 个答案:

答案 0 :(得分: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) {

});