asynchronous并行和承诺不会工作

我有以下两个片段:

这是我想要运行的单位:

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); }) 

}

这是检查单位的testing:

  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它进行到下一行(期待(spySend.calledOnce).to.equal(true);)而不等待vaultClient的承诺完成。 我需要做什么才能使期望运行后才运行“checkHealth”。

您不需要使用async – 您可以使用Promise.all直接在您的代码中使用Promise.all如其他人所build议的。

这里的代码使用来自Bluebird的promisifyAll ,但是您也可以将API转换为使用promise 。

 //.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 });