我们都熟悉成功和失败时的$.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
});