javascript - Promises : q. all() 混契约(Contract)步和异步功能

标签 javascript promise q

我仍在学习 Promises,但我遇到了一个问题。也许你可以帮助我。

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

所以我想要这样的东西:

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

但是如果 sonar.checkConfig 不是一个 promise 怎么办?我怎样才能给它一个 promise 行为?

目前我正在做这个

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

    var isOK = awesomeSyncTestHere();

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

    return qChecked.promise;
}

但它看起来很愚蠢。

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

非常感谢

最佳答案

在输入数组中放置非 promise 值到Q.all是没有问题的.他们将被视为已经兑现的 promise 。

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

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

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

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

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

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

关于javascript - Promises : q. all() 混契约(Contract)步和异步功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29103972/

相关文章:

javascript - 如何在 react-native-reanimated 中聆听值(value)变化?

Javascript:代码在放入函数时不会被执行

javascript - 使用 node.js + Q deferred/promises 模块从同步回调创建同步循环

javascript - 如何使用 Promise 循环异步调用

javascript - 动态创建的表单字段保持相同的 ID

javascript - AJAX 过滤 webgrid

javascript - 使用 mocha 的内置 promise 支持测试失败的 promise

javascript - 我如何使用可请求扩展的 Bluebird promise ?

javascript - Q Promise同步应答

javascript - q then 与 2 个函数和 then 后跟 catch 之间的区别