Estoy tratando de asignar una const en el nivel superior, donde el valor debe provenir de una función asíncrona. Sin embargo, la versión de nodejs en el servidor de producción que estoy usando no es lo suficientemente nueva como para recibir soporte, por lo que no puedo hacer algo como esto:
const value = await f(x) No puedo declarar la variable dentro de algo then porque no está en el nivel superior, por lo que algo como esto no funcionará :
f(x).then(val=>{const value=val}) // no top-level const value afterwards ¿Cómo puedo inicializar el const correctamente en este entorno?
Si ayuda, para este caso particular, la función en realidad regresa de forma sincrónica para el valor particular que le estoy pasando, pero dado que está definida como asíncrona y, a veces, regresa de manera asíncrona, en realidad está devolviendo una Promesa todo el tiempo.
Como solución (horrible), consideré simplemente asignar la const a la Promesa y luego extraer el valor cada vez que lo necesitaba usando .then() . Sin embargo, a pesar de que se resolvió la Promesa, esto parece hacer que el valor siempre se extraiga de forma asíncrona, lo que significa que no funcionará porque cuando necesito el valor lo necesito justo en ese punto y no después de que se complete la función actual o cuando sea.
Debe definir su var con "let" en lugar de const, luego asigne el valor en "then".
let value; f(x).then(val => value = val)Tal vez tengas una mejor manera de hacer esto, pero con el contexto que tenemos, lo haría de esta manera.
Tendrás que mover todo el código que necesite el valor de esa const dentro de una función. Muévalo en un (grande) then devuelva la llamada, o cree un contenedor de función async .
Así que digamos que su código ahora se ve así:
async function f(x) { // .... return //... } function g(value) { // something } const value = await f(x); // ... g(value); // ... console.log(value); // ...Luego cambia eso a:
(async function main() { async function f(x) { // .... return // ... } function g(value) { // something } const value = await f(x); // ... g(value); // ... console.log(value); // ... })(); // Execute mainDe acuerdo, no es absolutamente necesario mover todo lo que contiene, pero esto solo muestra cómo puede resolver su problema.