【问题标题】:Promises: q.all() with mixed sync and async functionsPromises: q.all() 混合同步和异步功能
【发布时间】:2015-03-18 00:22:46
【问题描述】:

我仍在学习 Promises,但我遇到了问题。也许你能帮帮我。

我有一个任务在运行实际的东西之前做一些检查。其中一些检查是同步的,另一些是异步的。

所以我想要这样的东西:

q.all([
    jenkins.checkConfig,
    gitlab.checkConfig,
    sonar.checkConfig
])
.then(
    function() {
        doSomethingReallyCoolHere();
    }
);

但是如果 sonar.checkConfig 不是一个承诺呢?我怎样才能给它一个承诺行为?

目前我正在这样做

var checkConfig = function() {
    var qChecked = q.defer();

    var isOK = awesomeSyncTestHere();

    if (isOK) {
        qChecked.resolve();
    }
    else {
        qChecked.reject();
    }

    return qChecked.promise;
}

但它看起来很愚蠢。

我想这不是一个好方法,对吧?

非常感谢

【问题讨论】:

标签: javascript promise q


【解决方案1】:

Q.all 的输入数组中放置非承诺值没有问题。他们将被视为已兑现的承诺。

但是,您需要将实际值(或承诺)放入数组中,而不是返回它们的函数。去吧

Q.all([
    jenkins.checkConfig(),
    gitlab.checkConfig(),
    sonar.checkConfig()
]).then(doSomethingReallyCoolHere);

如果您确实希望您的检查被抛出(并阻止 then 回调运行),您确实需要返回一个被拒绝的承诺。但是,您不应该为此使用 deferred:

function checkConfig() {
    if (awesomeSyncTestHere())
        return Q(true);
    else
        return Q.reject(new Error("awesome fail"));
}

或者,如果你有一个真正 throws 的测试,只需使用 Q.try

function checkConfig() {
    return Q.try(awesomeSyncTestHere);
}

【讨论】:

    猜你喜欢
    • 2013-11-29
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多