considera esto,
let value = ""; value = DATABASE_CALL(); module.exports = value;Cuando necesito el módulo anterior en otro módulo e intento acceder a la variable 'valor', es una cadena vacía. ¿Cómo puedo hacer que module.exports espere hasta que se complete la llamada DB anterior y se asigne un valor a la variable?
Asumo value = DATABASE_CALL(); es un sustituto del código asíncrono. (Si fuera realmente sincrónico como se muestra allí, simplemente lo usaría como el valor inicializador en value ).
Tiene algunas opciones para exportar un valor que solo está disponible de forma asíncrona:
Usar ESM en lugar de CommonJS y usar await de nivel superior para evitar que el módulo termine de cargarse hasta que se complete la operación de la base de datos.
export default await DATABASE_CALL(); ... donde DATABASE_CALL devuelve una promesa. (Si aún no lo está, puede envolverlo ).
El código que lo use no tendrá que await , pero el módulo no terminará de cargarse hasta que se complete la operación de la base de datos, y no se cargará en absoluto si la operación de la base de datos falla.
Esto realmente solo es apropiado si el módulo no se puede usar en absoluto sin ese valor.
Exportar una promesa del valor (ya sea que cambie a ESM o siga usando CommonJS):
module.exports = DATABASE_CALL(); ... donde (nuevamente) DATABASE_CALL devuelve una promesa.
El código que lo use tendría que await la promesa (o usar .then / .then .catch ).
Usando ESM en lugar de CommonJS y usando un valor de marca para indicar "todavía no está listo" ( null e undefined son útiles para eso) y actualizando el valor cuando se completa la llamada a la base de datos:
export let value = null; // ...later when DATABASE_CALL is complete value = /*...the value from the DB...*/;Las exportaciones de ESM son enlaces en vivo , lo que significa que si el módulo de origen actualiza la variable, las importaciones en otros módulos ven el valor actualizado.
Nota: Solo puede hacer esto con exportaciones con nombre ( value en el ejemplo), no con exportaciones predeterminadas.
Por supuesto, eso significa que el código que lo usa debe permitir la posibilidad de que aún no esté cargado.
Exportar una función que proporciona el valor y que se encarga de decirle a la persona que llama que el valor aún no está disponible (la implementación se deja al lector).
Probablemente hay otras opciones.
En los casos en que el módulo no tiene valor sin la información asíncrona, generalmente uso el #1. Si no, normalmente uso el #2.