我有一个提交一些数据的函数。根据某些布尔值的状态,我可能不想提交此数据。但是,调用者总是期望将延迟对象作为返回值来检查.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
答案 0 :(得分:1)
主要的问题是它通常具有设计气味,具有改变函数处理流程的布尔参数。
我认为你会同意做以下事情是没有意义的:
function process(doNotProcess) {
if (doNotProcess) return;
//process
}
在上面的示例中,简单地不调用process()
以避免处理更有意义。
"我理想的做法是在foo中跳过整个bar的调用,但是a 很多东西发生在bar()内部。完成后需要在两者中发生 例"
该代码可能应该从done
回调中计算出来并放入一个不同的函数,这样您就可以重用它而无需调用bar
。
"我可以破解$ .Deferred对象并立即解析/返回它, 但这似乎是糟糕的设计。"
当您需要标准化可能具有同步或异步实现的API时,创建延迟对象并立即解析它们是一种非常标准的方法。
这样做是一种非常好的做法,因为它可以让客户免于依赖实施细节。