Fermer

janvier 27, 2023

Wait () de niveau supérieur sans fonction async () dans NodeJs

Wait () de niveau supérieur sans fonction async () dans NodeJs


Voici comment fonctionne généralement la fonction async-wait :

function myDummyBackendCall() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
name: "Shivang",
id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
});
});
});
}


(async () => {
let data = await myDummyBackendCall();
console.log(data);
})();

Si vous êtes un développeur JS, vous sauriez que sans async une fonction, await l’appel se heurtera à une erreur. Et à juste titre. L’erreur ressemblera à ceci :

Parlons maintenant d’un scénario différent

Voici un autre exemple de mon fichier index.js dans mon projet NodeJs dans lequel je n’ai pas joint mon await appeler à l’intérieur d’un asyncfonction (la version de nœud que j’utilise est 19.3.0):

function myDummyBackendCall() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
name: "Shivang",
id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
});
});
});
}



let data = await myDummyBackendCall();
console.log(data);
// Output of node index.js
{
name: 'Shivang',
id: 'asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku'
}

Vous devez vous demander comment cela se fait et croyez-moi, c’est assez simple. Tout ce que vous avez à faire est d’ajouter une configuration simple, « type » avec « module » comme valeur dans le fichier package.json. Voici un exemple :

{
"name": "src",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type":"module", 
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC"
}

Dans les coulisses

Dans un package.json , “type” valeur de “module” dit à NodeJs d’interpréter les fichiers avec .js extension comme utilisant la syntaxe du module ES, par exemple : import déclaration ou import() expressions.

“type” définit comment le runtime NodeJs doit résoudre les spécificateurs ou charger les modules.

Il existe deux valeurs possibles pour “type” configuration :

  1. module
  2. commonjs (défaut)

Il y a des façons de mélanger les choses sans ajouter type à la package.json dossier. Puisque nous savons que commonjs est la valeur par défaut appliquée à votre projet NodeJs, chaque fichier avec .js l’extension sera traitée comme CommonJS. Mais si vous souhaitez toujours charger un ou plusieurs fichiers en tant que module ES, donnez simplement le fichier .mjs extension.

Voici l’exemple de code (sans type configuration):

{
"name": "src",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \\"Error: no test specified\\" && exit 1"
},
"author": "",
"license": "ISC"
}

Voici la capture d’écran du .mjs dossier:

Voici le code à l’intérieur index.mjs (exactement le même code que ci-dessus):

function myDummyBackendCall() {
return new Promise((resolve) => {
setTimeout(() => {
resolve({
name: "Shivang",
id: "asmdhajkdhajdsh8qweuqoweuiqepoi-0q-0eueiuaisjdaKcjaisku",
});
});
});
}

console.log(await myDummyBackendCall());

Voici le résultat :

Voici quelques points tirés directement du documentation officielle de NodeJs

  1. Fichiers se terminant par .mjs sont toujours chargés en tant que modules ES, quel que soit le parent le plus proche package.json.
  2. Fichiers se terminant par .cjs sont toujours chargés en tant que CommonJS quel que soit le parent le plus proche package.json.

Mais avant de devenir trop optimiste…

Cela ne fonctionne que lorsque await l’appel est effectué au niveau supérieur des modules. Voici une illustration :

Le chargeur de module ECMAScript est asynchrone. Cela signifie que l’attente de niveau supérieur permet au module d’agir comme une fonction asynchrone BIG lorsque NodeJs le charge en tant que module ES. Par conséquent, l’attente de niveau supérieur n’a pas besoin d’un wrapper de fonction asynchrone explicite. Cela signifie également qu’une attente sans asynchrone est un mythe !

Clause de non-responsabilité

Ceci est purement une fonctionnalité de NodeJs. Il n’y a pas de notion de .mjs et .cjs en JavaScript vanille.

***

Note de remerciement ❤️

Merci pour la visite. J’espère que vous trouverez cet article utile. S’il vous plaît Suivez-moi sur moyen et aidez-moi à atteindre 1 000 abonnés 🙏🏻. Cela m’encouragera vraiment à publier plus de contenu.

PS: Si vous pensez que quelque chose peut être amélioré ou manque d’explications appropriées, envoyez-moi une note dans la zone de commentaire ou envoyez-moi un e-mail à shiva.chaturvedi91@gmail.com. Après tout, tu peux aussi m’apprendre une chose ou deux.

TROUVÉ CELA UTILE ? PARTAGEZ-LE




Source link