成功并失败时,我们都熟悉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
});
答案 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) {
});