103 votes

Exportation de la fonction asynchrone correcte dans node.js

J'ai eu mon module personnalisé avec le code suivant:

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

Il a bien fonctionné si l'appel de la fonction à l'extérieur de mon module, cependant si j'ai appelé à l'intérieur je suis d'erreur lors de l'exécution:

(node:24372) UnhandledPromiseRejectionWarning: non Gérée promesse rejet (rejet de l'id: 1): ReferenceError: PrintNearestStore n'est pas défini

Quand j'ai changé de syntaxe:

module.exports.PrintNearestStore = PrintNearestStore;

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

}

Il a commencé à fonctionner à l'intérieur du module, mais ne parvient pas à l'extérieur du module - je suis d'erreur:

(node:32422) UnhandledPromiseRejectionWarning: non Gérée promesse rejet (rejet de l'id: 1): TypeError: mymodule.PrintNearestStore est pas une fonction

J'ai donc changé le code pour:

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

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

Et maintenant, il fonctionne dans tous les cas: à l'intérieur et à l'extérieur. Toutefois veulent comprendre la sémantique et si il y a de plus beau et le plus court chemin pour l'écrire? Comment définir correctement et l'utilisation asynchrone en fonction à la fois: à l'intérieur et à l'extérieur (exportations) module?

135voto

Felix Kling Points 247451

Ce n'est pas vraiment de quoi avec async fonctions spécialement. Si vous voulez appeler une fonction à l'interne et à l'exportation, de la définir d'abord , puis l'exporter.

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;

Explication des problèmes avec votre tente:

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

Ce n'est pas possible de définir une fonction dans le module. La définition de la fonction est une fonction d'expression. Le nom d'une expression de fonction crée une variable à l'intérieur de la fonction elle-même. Exemple 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`

Voir aussi Nommé les expressions de fonction démystifié. Vous pouvez bien sûr vous référer à la fonction si vous vous referez à module.exports.PrintNearestStore partout.


module.exports.PrintNearestStore = PrintNearestStore;

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

}

C'est presque OK. Le problème est que la valeur de PrintNearestStore est undefined lorsque vous l'attribuer module.exports.PrintNearestStore. L'ordre d'exécution est:

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

Exemple 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 vous avez changé l'ordre qu'il fonctionne comme prévu.


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

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

Cela fonctionne parce que le temps de la fonction qui lui est assignée module.exports.PrintNearestStore est exécutée, PrintNearestStore a pour fonction de sa valeur.

Exemple simple:

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

5voto

Grundy Points 10118

Erreur avec le premier cas: PrintNearestStore - Expression de fonction, ce nom n'est donc pas disponible en dehors.

erreur avec deuxième cas: using variable, à la place de la déclaration de fonction. Dans ce cas, les déclarations de la variable PrintNearestStore sont levées. Vous pouvez donc utiliser ce nom avant la ligne var PrintNearestStore = ... , mais dans ce cas, la valeur ne serait pas définie .

Ainsi, la solution la plus simple change la deuxième variante comme ceci:

 module.exports.PrintNearestStore = PrintNearestStore;

async function PrintNearestStore(session, lat, lon) {

}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X