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`