返回延迟对象或null

Return deferred object or null

本文关键字:null 对象 延迟 返回      更新时间:2023-09-26

我有一个提交一些数据的函数。根据某个布尔值的状态,我可能不想提交这个数据。然而,调用者总是期望一个延迟的对象作为返回值来检查。done()或。fail()。似乎你不能返回null或什么也不返回当某些事情预期完成/失败(有意义),所以我不知道如何从这个异步调用返回。

我可以插入$。延迟对象并立即解析/返回它,但这似乎是糟糕的设计。我不能在这里更改调用方法。

在不使用延迟对象的情况下,如何返回延迟对象或满足。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/

主要问题是,使用布尔参数改变函数的进程流通常是一种设计气味。

我想你会同意这样做是没有意义的:

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

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

"我理想的做法是在foo中跳过整个bar调用,但是abar()中发生了很多事情。两者都需要这样做情况下"

这些代码可能应该从done回调中提取出来,并放入一个不同的函数中,这将允许您重用它而不必调用bar

"我可以黑进$。"延迟对象并立即解析/返回它,但这看起来像是糟糕的设计。"

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

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