Promise:带有混合同步和异步函数的q.all()

时间:2015-03-17 16:02:56

标签: javascript promise q

我还在学习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;
}

但它看起来很愚蠢。

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

非常感谢

1 个答案:

答案 0 :(得分:1)

将输入数组中的非承诺值放到Q.all没有问题。他们将被视为与他们一起实现的承诺。

但是,您需要在数组中放置实际值(或promises),而不是返回它们的函数。只是去

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

如果你确实希望你的支票抛出(并阻止then回调运行),你将需要确实返回被拒绝的承诺。但是,您不应该使用延迟:

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

或者,如果您的测试真的是throw,请使用Q.try

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