valid try only node funciones español catch await async asincronas javascript node.js async-await

try - return in async function javascript



Corregir la exportación de la función asíncrona en node.js (2)

Tuve mi módulo personalizado con el siguiente código:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) { ... }

Funcionó bien si llamo a la función fuera de mi módulo, sin embargo, si llamé dentro recibí un error mientras ejecutaba:

(nodo: 24372) UnhandledPromiseRejectionWarning: rechazo de promesa no manejado (id de rechazo: 1): ReferenceError: PrintNearestStore no está definido

Cuando cambié la sintaxis a:

module.exports.PrintNearestStore = PrintNearestStore; var PrintNearestStore = async function(session, lat, lon) { }

Comenzó a funcionar bien dentro del módulo, pero falla fuera del módulo. Recibí un error:

(nodo: 32422) UnhandledPromiseRejectionWarning: rechazo de promesa sin manejar (id de rechazo: 1): TypeError: mymodule.PrintNearestStore no es una función

Así que he cambiado el código a:

module.exports.PrintNearestStore = async function(session, lat, lon) { await PrintNearestStore(session, lat, lon); } var PrintNearestStore = async function(session, lat, lon) { ... }

Y ahora funciona en todos los casos: dentro y fuera. Sin embargo, ¿quieres entender la semántica y si hay una forma más bonita y más corta de escribirla? ¿Cómo definir y usar correctamente la función asíncrona : dentro y fuera del módulo (exportaciones)?


Error en el primer caso: PrintNearestStore - expresión de función, por lo que este nombre no está disponible fuera.

error con el segundo caso: usando variable, en lugar de declaración de función. En este caso, la declaración de la variable PrintNearestStore se eleva, por lo tanto, puede usar este nombre antes de la línea var PrintNearestStore = ... , pero en este caso el valor sería indefinido .

Por lo tanto, la solución más simple cambia la segunda variante como esta:

module.exports.PrintNearestStore = PrintNearestStore; async function PrintNearestStore(session, lat, lon) { }


Esto realmente no tiene nada que ver con las funciones asíncronas especialmente. Si desea llamar una función internamente y exportarla, defínala primero y luego expórtela.

async function doStuff() { // ... } // doStuff is defined inside the module so we can call it wherever we want // Export it to make it available outside module.exports.doStuff = doStuff;

Explicación de los problemas con sus intentos:

module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) { ... }

Esto no define una función en el módulo. La definición de la función es una expresión de la función. El nombre de una expresión de función solo crea una variable dentro de la propia función. Ejemplo más simple:

var foo = function bar() { console.log(typeof bar); // ''function'' - works }; foo(); console.log(typeof foo); // ''function'' - works console.log(typeof bar); // ''undefined'' - there is no such variable `bar`

Véase también Funciones de funciones con nombre desmitificadas . Por supuesto, puede referirse a la función si se refiera a module.exports.PrintNearestStore todas partes.

module.exports.PrintNearestStore = PrintNearestStore; var PrintNearestStore = async function(session, lat, lon) { }

Esto está casi bien. El problema es que el valor de PrintNearestStore undefined está undefined cuando lo asigna a module.exports.PrintNearestStore . El orden de ejecución es:

var PrintNearestStore; // `undefined` by default // still `undefined`, hence `module.exports.PrintNearestStore` is `undefined` module.exports.PrintNearestStore = PrintNearestStore; PrintNearestStore = async function(session, lat, lon) {} // now has a function as value, but it''s too late

Ejemplo más simple:

var foo = bar; console.log(foo, bar); // logs `undefined`, `undefined` because `bar` is `undefined` var bar = 21; console.log(foo, bar); // logs `undefined`, `21`

Si cambia el orden funcionaría como se esperaba.

module.exports.PrintNearestStore = async function(session, lat, lon) { await PrintNearestStore(session, lat, lon); } var PrintNearestStore = async function(session, lat, lon) { ... }

Esto funciona porque en el momento en que se ejecuta la función asignada a module.exports.PrintNearestStore , PrintNearestStore tiene la función como su valor.

Ejemplo más simple:

var foo = function() { console.log(bar); }; foo(); // logs `undefined` var bar = 21; foo(); // logs `21`