返回延迟对象或null

时间:2015-09-09 15:12:10

标签: javascript jquery

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

1 个答案:

答案 0 :(得分:1)

主要的问题是它通常具有设计气味,具有改变函数处理流程的布尔参数。

我认为你会同意做以下事情是没有意义的:

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

    //process
}

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

  

"我理想的做法是在foo中跳过整个bar的调用,但是a   很多东西发生在bar()内部。完成后需要在两者中发生   例"

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

  

"我可以破解$ .Deferred对象并立即解析/返回它,   但这似乎是糟糕的设计。"

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

这样做是一种非常好的做法,因为它可以让客户免于依赖实施细节。