web-dev-qa-db-fra.com

Comment exporter une fonction asynchrone à partir d'un module de noeud

J'essaie d'écrire un module de nœud pour gérer mes différents appels de base de données. Je souhaite utiliser async/wait autant que possible, mais cela me pose problème.

J'utilise un peu les promesses et exporte bien ces fonctions. Exemple:

function GetUsernames() {
    return new Promise(function (resolve, reject) {
        sql.connect(config).then(function () {
            new sql.Request()
                .query("SELECT [UserName] FROM [Users] ORDER BY [LastLogin] ASC").then(function (recordset) {
                    resolve(recordset);
                }).catch(function (err) {
                    reject(err);
                });
        });
    });
}

Et puis j'exporte dans les domaines suivants:

module.exports = {
    GetUsernames: GetUsernames,
    GetScopes: GetScopes,
    UpdateToken: UpdateToken,
    SetOwner: SetOwner
};

Mais, comment devrais-je faire cela, avec une fonction async, pour utiliser le async/wait qui est disponible dans node7?

Est-ce que je retourne juste une promesse? J'ai essayé de faire cela, mais quand je l'appelle alors dans mon code, cela ne fonctionne pas.

const db = require("dataprovider");
...
var result = await db.GetUsernames();

Ça me donne: 

SyntaxError: Identifiant inattendu

sur le nom de la base de données (fonctionne bien si j'utilise seulement les fonctions promesses, avec then ().)

Peut-être que mes compétences sur Google sont terribles, mais je n'ai pas réussi à rechercher quoi que ce soit que je puisse utiliser sur cette question. 

Comment puis-je créer une fonction asynchrone, dans mon module, que je puisse attendre ailleurs?

3
Nicolai

Pour activer le mot-clé wait, vous devez l'insérer dans une fonction asynchrone.

const db = require("dataprovider");
...
let result = getUserNames();

async function getUserNames() {
    return await db.GetUsernames();
}

Voir http://javascriptrambling.blogspot.com/2017/04/to-promised-land-with-asyncawait-and.html pour plus d'informations.

En outre, tout comme un FYI, il est une convention de code pour commencer à fonctionner en minuscule, à moins que vous retourniez une classe à partir de celle-ci.

7
Kevin Williams

async - wait pattern rend votre code plus facile à lire. Mais les nœuds ne permettent pas d’attente globale. Vous ne pouvez attendre qu'un flux asynchrone. Ce que vous essayez de faire est d’attendre en dehors du flux async. Ceci n'est pas autorisé. C'est un peu un anti-motif pour une application de noeud. Lorsque nous traitons des promesses, nous générons un flux asynchrone dans notre programme. Notre programme continue sans attendre de promesse. Vous pouvez donc exporter vos fonctions en mode asynchrone, mais vous ne pouvez pas les attendre en dehors du flux async. par exemple.

const db = require('dataprovider');
...
let result = (async () => await db.GetUserNames())();
console.log(result); // outputs: Promise { <pending> }

Ainsi, le modèle d'attente asynchrone fonctionne pour le flux asynchrone. Utilisez-les donc dans des fonctions asynchrones, de sorte que le noeud puisse les exécuter de manière asynchrone. En outre, vous pouvez également attendre des promesses. par exemple.

let fn = async () => await new Promise( (resolve, reject)=>{...} );
fn().then(...);

Ici, vous avez créé la fonction asynchrone 'fn'. Cette fonction est alors possible. Vous pouvez aussi attendre que fn soit inséré dans une autre fonction asynchrone.

let anotherFn = async () => await fn();
anotherFn().then(...);

Ici, nous attendons une fonction asynchrone dans une fonction asynchrone. Le motif Async-Await rend votre code lisible et concis. Cela se reflète dans les grands projets. 

1
Market Queue