【发布时间】:2015-12-05 15:29:05
【问题描述】:
我有一个提交一些数据的函数。根据某些布尔值的状态,我可能不想提交此数据。然而,调用者总是期待一个延迟对象作为检查 .done() 或 .fail() 的返回值。当某些事情期望完成/失败(有意义)时,您似乎不能返回 null 或什么也不返回,所以我不知道如何从这个异步调用中返回。
我可以破解 $.Deferred 对象并立即解析/返回它,但这似乎是糟糕的设计。此处无法更改调用方式。
如何在不使用延迟对象的情况下返回延迟对象或其他满足 .done() 或 .fail() 的返回值?
function foo(a) {
bar(a).done(function () {
console.log("done");
}).fail(function () {
console.log("fail");
});
}
function bar(a) {
if (a){
// Could create a $.Deferred and resolve it
return;
}
return doAsync();
}
function doAsync() {
var defer = $.Deferred();
defer.resolve();
return defer.promise();
}
foo(false); // fine
foo(true); // error
【问题讨论】:
-
“我可以破解 $.Deferred 对象并立即解析/返回它,但这似乎是糟糕的设计。” 一点也不。
-
@FelixKling 嗯,真的吗?我最理想的做法是在
foo中跳过对bar的整个调用,但是bar().done内部会发生很多事情,这两种情况都需要发生。 -
这正是您使用immediately resolved promise 所获得的。无论如何,它都不是反模式。
标签: javascript jquery