异步并行和承诺不会工作

时间:2016-08-17 14:03:32

标签: node.js asynchronous promise

我有以下两个片段:

1.这是我想要运行的单位:

health.checkHealth = function (req, res) {
async.parallel({
    cassandra: function (callback) {
        cassandraRepository.ping(callback);
    },
    kafka: function (callback) {
        kafkaHelper.ping(callback);
    },
    vault: function (callback) {
        vaultClient.health()
            .then((isOk)=>{
                 callback(null, isOk)})
            .catch(()=>
                callback(null, false));
    }
}, function (err, result) {
    var response = {};
    if (result.cassandra) {
        response.cassandra = "OK";
    } else {
        response.cassandra = "Failed";
        res.status(500);
    }

    if (result.kafka) {
        response.kafka = "OK";
    } else {
        response.kafka = "Failed";
        res.status(500);
    }

    if (result.vault) {
        response.vault = "OK";
    } else {
        response.vault = "Failed";
        res.status(500);
    }

    res.send(response);
})

}

2.这是检查单位的测试:

     describe('vault is avaliable', function () {
        beforeEach(sinon.test(function () {
            sinon.stub(vaultClient, "health").resolves(true);
        }));

        it('should return 200', sinon.test(function (done) {
            var response = {
                vault: "OK"
            };

            var req = {};
            var res = {};
            var spySend = res.send = sinon.spy();
            var spyStatus = res.status = sinon.spy();

            health.checkHealth(req, res);
            expect(spySend.calledOnce).to.equal(true);
            expect(spySend.calledWith(response));
            expect(spyStatus.calledOnce).to.equal(false);
        }));

    });

我的问题是当我调用checkHealth时它会进入下一行(expect(spySend.calledOnce).to.equal(true);)而不等待vaultClient的承诺完成。  我需要做什么才能在运行'checkHealth'之后运行预期。

1 个答案:

答案 0 :(得分:2)

您无需使用async - 您可以使用Promise.all直接在您的代码中使用promises,如其他人所建议的那样。

此处的代码使用的是Bluebird的promisifyAll,但您也可以自己convert the APIs to use promises

//.props is bluebird, you can `.all` with native promises too
Promise.props({
    cassandra: cassandraRepository.pingAsync(); // created by promisifyAll
    kafka: kafkaHelper.pingAsync(),
    vault: vaultClient.health()
}).then(results => {
   // access results.cassandra, results.kafka and results.vaule here
});
相关问题