Corrija la función de exportación asíncrona en node.js

Aleksey Kontsevich:

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)?

Felix Kling:

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.PrintNearestStoretodas partes.


module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function(session, lat, lon) {

}

Esto esta casi bien. El problema es que el valor de PrintNearestStorees undefinedcuando 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 , PrintNearestStoretiene 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

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

La función asíncrona en la API de Node.js no funciona según lo previsto

Módulo Node.js: función de exportación asíncrona

Función asíncrona de exportación de React.js

Necesita OBTENER una API REST dentro de la función asíncrona en la aplicación Slack Node.js

node.js es el resultado de una llamada de función asíncrona en la respuesta del servidor

Devolución de la matriz después de completar la función asíncrona - Node.js

node js: ¿cómo devuelvo un valor de una función cuando depende de la función asíncrona en el interior?

La función asíncrona Node.js no se reconoce como una función asíncrona válida

Escribir en un archivo en Node.JS dentro de una función asíncrona

función asíncrona foreach en node.js

En Node.js, ¿es posible ejecutar una función de middleware de forma asíncrona?

Cómo devolver un valor de una función asíncrona en node.js

La función asíncrona lambda node.js no puede acceder a las devoluciones de llamada

¿Una función en espera dentro de una función asíncrona tiene que devolver una promesa? (node.js)

función asíncrona y de espera Node.js

Función asíncrona de Node.js, process.nextTick ()

función asíncrona y de espera Node.js

Reaccionar la función asíncrona de llamada nativa y usar return en otra función asíncrona

problemas al usar node.js con el módulo node-fetch en la función asíncrona de AWS Lambda

Retorno de la función asíncrona en la ruta hapi

activar la función asíncrona en la pantalla de carga

Devuelve el resultado de la función asíncrona en el nodo js

Valor de retorno de la función asíncrona en mecanografiado

función asíncrona dentro de la nueva función asíncrona

Función asíncrona dentro de la función asíncrona

Reaccionar llamada asíncrona nativa en la función de renderizado

¿Ejecutar la función asíncrona en el hilo de fondo?

Comportamiento ambiguo de la función asíncrona en javascript

La función asíncrona de Kotlin no se ejecuta en paralelo

TOP Lista

CalienteEtiquetas

Archivo