Espere varias conexiones db antes de iniciar el servidor Express?

Estoy trabajando en una aplicación Express. En el inicio, se conecta a un servidor Redis y a un servidor PostgreSQL. Me gustaría esperar a que ambas conexiones tengan éxito antes de iniciar el servidor Express. Ahora, si estuviera esperando una callback, podría iniciar el servidor Express dentro de esa callback. Pero, ¿cuál es la mejor manera de hacer esto cuando se espera en más de una operación asíncrona? Soy nuevo en esto. ¿Hay un buen patrón idiomático para hacer este tipo de cosas? ¿Tal vez agrupar promesas o …?

Las promesas son lo que quieres.

Puede usar .all() en una serie de promesas para esperar a que todas se completen. No mencionaste qué biblioteca de Promise estás usando, pero es bastante universal. Aquí está la documentación de Bluebird: https://github.com/petkaantonov/bluebird/blob/master/API.md#all—promise

Las promesas son probablemente la forma idiomática de resolver esto. Tendrá que “prometer” sus funciones que devuelven las devoluciones de llamada para convertirlas en algo que devuelve y resuelve promesas, pero luego Promise.all() funcionará bien. Personalmente uso Bluebird para el desarrollo de mi nodo y prometo regularmente funciones existentes o módulos completos que usan devoluciones de llamada asíncronas.


Si no está utilizando una biblioteca que puede prometer funciones no prometidas, también puede usar un contador para realizar un seguimiento de cuándo se realizan todas las devoluciones de llamada. Esta es la forma “más antigua” de hacer las cosas, pero también funciona bien. Tal operación funciona así:

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