Javascript 承诺:q.all()具有混合同步和异步函数

Javascript 承诺:q.all()具有混合同步和异步函数,javascript,promise,q,Javascript,Promise,Q,我仍在学习承诺,我面临一个问题。也许你能帮我 我有一个任务,在运行真正的东西之前做一些检查。其中一些检查是同步的,另一些是异步的 所以我想要这样的东西: q.all([ jenkins.checkConfig, gitlab.checkConfig, sonar.checkConfig ]) .then( function() { doSomethingReallyCoolHere(); } ); 但如果sonar.checkConfig

我仍在学习承诺,我面临一个问题。也许你能帮我

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

所以我想要这样的东西:

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;
}
但它看起来很愚蠢

我想这不是个好办法,对吧


非常感谢

将非承诺值放置在输入数组中不会有问题。他们将被视为一个已经兑现的承诺

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

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"));
}
或者,如果您有一个真正抛出s的测试,只需使用

相关:(角度)
function checkConfig() {
    return Q.try(awesomeSyncTestHere);
}