Tenía 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é adentro, recibí un error al ejecutar:
(nodo: 24372) UnhandledPromiseRejectionWarning: Rechazo de promesa no controlado (id de rechazo: 1): Error de referencia: 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 no controlado (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: por dentro y por fuera. Sin embargo, ¿quieres entender la semántica y si hay una forma más hermosa y más corta de escribirla? ¿Cómo definir y utilizar correctamente la función asíncrona tanto: dentro como fuera del módulo (exportaciones)?
Esto realmente no tiene nada que ver con las funciones asíncronas especialmente. Si desea llamar a 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 tus intentos:
module.exports.PrintNearestStore = async function PrintNearestStore(session, lat, lon) {
...
}
Esto no define una función en el módulo. La definición de función es una expresión de función . El nombre de una expresión de función solo crea una variable dentro de la función misma. 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`
Ver también Expresiones de funciones nombradas desmitificadas . Por supuesto, podría referirse a la función si se refiriera a module.exports.PrintNearestStore
todas partes.
module.exports.PrintNearestStore = PrintNearestStore;
var PrintNearestStore = async function(session, lat, lon) {
}
Esto esta casi bien. El problema es que el valor de PrintNearestStore
es undefined
cuando se lo asigna 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 para cuando module.exports.PrintNearestStore
se ejecuta la función asignada , 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`
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras