在启动快速服务器之前等待几个数据库连接?

Wait for several db connections before starting express server?

我正在开发 Express 应用程序。在启动时,它连接到 Redis 服务器和 PostgreSQL 服务器。在启动快速服务器之前,我想等待两个连接都成功。现在,如果我只等待 one 回调,我可以在该回调中启动 Express 服务器。但是在等待多个异步操作时如何最好地做到这一点呢?我对此很陌生。做这种事情有一个好的惯用模式吗?也许将 promises 组合在一起或者..?

承诺就是你想要的。

您可以对一系列承诺使用 .all() 以等待它们全部完成。您没有提到您使用的是什么 Promise 库,但它相当通用。这是蓝鸟文档:https://github.com/petkaantonov/bluebird/blob/master/API.md#all---promise

Promises 可能是解决这个问题的惯用方法。你将不得不 "promisify" 你的函数 return 回调将它们变成 return 的东西并解决承诺,但是 Promise.all() 会工作得很好。我个人使用 Bluebird 进行我的 nodejs 开发,并定期承诺使用异步回调的现有功能或整个模块。


如果您不以其他方式使用可以承诺未承诺函数的库,那么您也可以只使用计数器来跟踪所有回调何时完成。这是 "older fashioned" 的做事方式,但也可以正常工作。这样的操作是这样的:

function setup(fn) {
    // initialize counter to number of async operations
    var counter = 3;
    function checkDone() {
        --counter;
        if (counter <= 0) {
            fn();
        }
    }

    firstAsyncFunction(...., checkDone);
    secondAsyncFunction(...., checkDone);
    thirdAsyncFunction(...., checkDone);

}

setup(function() {
    // this will get called when all the initial async operations are done
});