J'ai un module de nœud simple qui se connecte à une base de données et possède plusieurs fonctions pour recevoir des données, par exemple cette fonction:
dbConnection.js:
import mysql from 'mysql';
const connection = mysql.createConnection({
host: 'localhost',
user: 'user',
password: 'password',
database: 'db'
});
export default {
getUsers(callback) {
connection.connect(() => {
connection.query('SELECT * FROM Users', (err, result) => {
if (!err){
callback(result);
}
});
});
}
};
Le module serait appelé de cette façon à partir d'un module de nœud différent:
app.js:
import dbCon from './dbConnection.js';
dbCon.getUsers(console.log);
Je voudrais utiliser des promesses au lieu de rappels pour renvoyer les données. Jusqu'à présent, j'ai lu sur les promesses imbriquées dans le fil suivant: Ecrire du code propre avec des promesses imbriquées , mais je n'ai pas trouvé de solution assez simple pour ce cas d'utilisation. Quelle serait la bonne façon de revenir en result
utilisant une promesse?
Réponses:
Utiliser la
Promise
classeJe recommande de jeter un œil aux documents Promise de MDN qui offrent un bon point de départ pour utiliser Promises. Alternativement, je suis sûr qu'il existe de nombreux tutoriels disponibles en ligne. :)
Remarque: les navigateurs modernes prennent déjà en charge la spécification ECMAScript 6 des promesses (voir les documents MDN liés ci-dessus) et je suppose que vous souhaitez utiliser l'implémentation native, sans bibliothèques tierces.
Quant à un exemple concret ...
Le principe de base fonctionne comme ceci:
resolve
etreject
Cela peut sembler beaucoup alors voici un exemple réel.
Utilisation de la fonctionnalité de langage async / await (Node.js> = 7.6)
Dans Node.js 7.6, le compilateur JavaScript v8 a été mis à niveau avec le support async / await . Vous pouvez maintenant déclarer les fonctions comme étant
async
, ce qui signifie qu'elles renvoient automatiquement unPromise
qui est résolu lorsque la fonction asynchrone termine l'exécution. Dans cette fonction, vous pouvez utiliser leawait
mot - clé pour attendre qu'une autre promesse se résout.Voici un exemple:
la source
Avec bluebird, vous pouvez utiliser
Promise.promisifyAll
(etPromise.promisify
) pour ajouter des méthodes prêtes pour Promise à n'importe quel objet.Et utilisez comme ceci:
ou
Ajout de broyeurs
Bluebird prend en charge de nombreuses fonctionnalités, l'une d'elles étant les éliminateurs, elle vous permet de disposer en toute sécurité d'une connexion après sa fin à l'aide de
Promise.using
etPromise.prototype.disposer
. Voici un exemple de mon application:Ensuite, utilisez-le comme ceci:
Cela mettra automatiquement fin à la connexion une fois la promesse résolue avec la valeur (ou rejetée avec un
Error
).la source
try-catch
à chaque appel. Donc, si vous le faites assez souvent et que la complexité de votre code est similaire à celle de l'exemple, vous devriez reconsidérer cela.Node.js version 8.0.0+:
Vous ne devez pas utiliser Bluebird pour promisify les méthodes de l' API de noeud plus. Parce qu'à partir de la version 8+, vous pouvez utiliser nativement util.promisify :
Maintenant, vous n'avez pas besoin d'utiliser une bibliothèque tierce pour faire la promesse.
la source
En supposant que l'API de votre adaptateur de base de données ne se génère pas d'
Promises
elle-même, vous pouvez faire quelque chose comme:Si l'API de base de données prend en charge,
Promises
vous pouvez faire quelque chose comme: (ici, vous voyez la puissance de Promises, votre fluff de rappel disparaît pratiquement)Utilisation
.then()
pour renvoyer une nouvelle promesse (imbriquée).Appeler avec:
J'ai utilisé une maquette d'API pour mes promesses, votre API peut être différente. Si vous me montrez votre API, je peux l'adapter.
la source
Promise
constructeur et une.promise()
méthode?promise = new Promise();
?Promises
vous êtes bloqué par l'utilisation de rappels. Une fois que vous entrez dans le territoire promis, la «pyramide» disparaît. Consultez le deuxième exemple de code pour savoir comment cela fonctionnerait.2019:
Utilisez ce module natif
const {promisify} = require('util');
pour convertir un ancien modèle de rappel en modèle de promesse afin que vous puissiez obtenir des avantages à partir duasync/await
codela source
Lors de la mise en place d'une promesse, vous prenez deux paramètres,
resolve
etreject
. En cas de succès, appelezresolve
avec le résultat, en cas d'échec, appelezreject
avec l'erreur.Ensuite, vous pouvez écrire:
callback
sera appelé avec le résultat de la promesse renvoyéegetUsers
, ieresult
la source
En utilisant la bibliothèque Q par exemple:
la source
Le code ci-dessous ne fonctionne que pour le nœud -v> 8.x
J'utilise ce middleware MySQL promis pour Node.js
lire cet article Créer un middleware de base de données MySQL avec Node.js 8 et Async / Await
database.js
Vous devez mettre à niveau le nœud -v> 8.x
vous devez utiliser la fonction async pour pouvoir utiliser await.
exemple:
la source