【问题标题】:Async parallel and promises wont work异步并行和承诺不起作用
【发布时间】:2016-08-18 01:11:38
【问题描述】:

我有以下两个sn-ps:

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.callOnce).to.equal(true);),而无需等待 vaultClient 的承诺完成。 我需要做什么才能使期望仅在“checkHealth”运行后才运行。

【问题讨论】:

  • 是的。不要在承诺中使用async.js
  • 你使用的是什么 promise 库?
  • @Bergi 它的原生承诺。有没有办法使用 promise 来克服这个问题?
  • 是的。只需删除async.parallel 并改用Promise.all。你可能想promisifyping

标签: node.js asynchronous promise


【解决方案1】:

您不需要使用async - 您可以按照其他人的建议直接在代码中使用Promise.all 的承诺。

这里的代码使用来自 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
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-03
    • 2018-06-14
    • 2018-07-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多