gpt4 book ai didi

javascript - 返回延迟对象或 null

转载 作者:行者123 更新时间:2023-11-27 23:53:30 25 4
gpt4 key购买 nike

我有一个提交一些数据的函数。根据某些 bool 值的状态,我可能不想提交此数据。然而,调用者总是期望一个延迟对象作为返回值来检查 .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

http://jsfiddle.net/ma4grjj4/2/

最佳答案

主要问题是,使用 bool 参数来改变函数的处理流程通常是一种设计味道。

我想你会同意做下面这样的事情是没有意义的:

function process(doNotProcess) {
if (doNotProcess) return;

//process
}

在上面的示例中,简单地不调用 process() 来避免处理会更有意义。

"What I would do ideally is in foo skip the entire call of bar, but a lot of stuff happens inside of bar().done that needs to occur in both cases"

该代码可能应该从 done 回调中提取出来,并放入不同的函数中,这样您就可以重用它,而无需调用 bar

"I can hack in a $.Deferred object and immediately resolve/return it, but that seems like bad design."

当您需要标准化可能具有同步或异步实现的 API 的使用时,创建延迟对象并立即解析它们是一种相当标准的方法。

这样做是一个非常好的做法,因为它使客户端不必依赖实现细节。

关于javascript - 返回延迟对象或 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32483321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com