Exportation appropriée de la fonction asynchrone dans node.js

J'ai eu mon propre module utilisateur avec le code suivant:


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


Cela a bien fonctionné si vous appelez une fonction en dehors de mon module, cependant, si j'ai appelé à l'intérieur, j'ai eu une erreur lors de l'exécution:

/30/ UnhandledPromiseRejectionWarning: Promesse non traitée
déviation /Identifiant de déviation: 1/: ReferenceError: PrintNearestStore n'est pas
certain

Quand j'ai changé la syntaxe sur:


module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function/session, lat, lon/ {

}


Il a commencé à fonctionner normalement à l'intérieur du module, mais ne fonctionne pas en dehors du module - J'ai eu une erreur:

/node:32422/ UnhandledPromiseRejectionWarning: Promesse non traitée
déviation /Identifiant de déviation: 1/: TypeError: mymodule.PrintNearestStore is
Ce n'est pas une fonction

Par conséquent, j'ai 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, cela fonctionne dans tous les cas: à l'intérieur et à l'extérieur. Cependant, voulez-vous trier la sémantique et s'il y a une meilleure façon de l'écrire? Comment déterminer et utiliser

asynchrone

Fonctionner à l'intérieur et à l'extérieur du module /exportation/?
Invité:

Georges

Confirmation de:

Cela n'a rien à voir avec des fonctions asynchrones spécifiquement. Si vous voulez appeler la fonction en interne

et

exporter

première

Déterminez-le, puis à l'exportation.


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 vos tentatives:


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


Cela ne définit pas la fonction dans le module. Définition de la fonction - c'est

expression

Les fonctions . Le nom de l'expression de fonction crée uniquement une variable dans 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 Demisetification
https://kangax.github.io/nfe/
. Bien sûr, vous pourriez vous référer à cette fonctionnalité si parle partout par rapport à
module.exports.PrintNearestStore

.


module.exports.PrintNearestStore = PrintNearestStore;

var PrintNearestStore = async function/session, lat, lon/ {

}


ce

presque

OK. Le problème est que
PrintNearestStore

également
undefined

, Quand vous l'avez attribuée
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é de commande, cela fonctionnera, comme prévu.


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

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


Ça marche parce que , Quel

au moment

Exécution

Fonctions assignées
module.exports.PrintNearestStore

,
PrintNearestStore

Il a une fonction comme valeur.

Exemple simple:


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

Frederic

Confirmation de:

Erreur avec le premier cas:
PrintNearestStore

-Ef fonction, donc ce nom n'est pas disponible à l'extérieur.

Erreur dans le second cas: Utilisation d'une variable au lieu de déclarer une fonction. Dans ce cas, l'annonce de la variable PrintNearestStore sera soulevé, vous pouvez donc utiliser ce nom

avant que

Doubler
var PrintNearestStore = ...

, Mais dans ce cas, la valeur sera

Incertain

.

Donc, la solution la plus simple pour changer la deuxième option comme celle-ci:


module.exports.PrintNearestStore = PrintNearestStore;

async function PrintNearestStore/session, lat, lon/ {

}

Pour répondre aux questions, connectez-vous ou registre