Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi le gestionnaire d'erreurs de la deuxième promesse est-il exécuté avant la sortie « Échec » de la première promesse ?

Linda Hamilton
Libérer: 2024-11-14 09:45:02
original
643 Les gens l'ont consulté

Why is the Second Promise Error Handler Executed Before the First Promise's

Node.js Express et les promesses ne se comportent pas comme prévu

La première promesse n'attend pas l'achèvement de findUser()

Dans le code fourni, la première promise n'attend pas le retour de findUser() avant de continuer car :

  • .findUser() interroge de manière asynchrone la base de données à l'aide d'une fonction de rappel.
  • Le rappel n'est pas utilisé pour résoudre la promesse. Au lieu de cela, la promesse est résolue avec des lignes, ce qui n'est pas défini au moment de la création de la promesse.

Solution :

Enveloppez la requête de base de données dans une fonction qui renvoie une promesse et résout la promesse avec le résultat de la requête :

me.findUser = function(params, res) {
    var username = params.username;

    return new Promise(function (resolve, reject) {
        pool.getConnection(function (err, connection) {
            console.log("Connection ");

            if (err) {
                console.log("ERROR 1 ");
                res.send({"code": 100, "status": "Error in connection database"});
                reject(err); // Reject the promise with the error
            } else {
                connection.query('select Id, Name, Password from Users ' +
                    'where Users.Name = ?', [username], function (err, rows) {
                    connection.release();
                    if (!err) {
                        resolve(rows); // Resolve the promise with the query result
                    } else {
                        reject(err); // Reject the promise with the error
                    }
                });
            }
        });
    });
}
Copier après la connexion

Pourquoi le deuxième gestionnaire d'erreurs est affiché au lieu d'un échec

Le gestionnaire d'erreurs car la seconde promesse est appelée parce que la première promesse est rejetée. Cependant, le console.log("Failed"); La ligne du gestionnaire d'erreurs n'est pas exécutée car une erreur est générée à l'intérieur du bloc .then().

Pour gérer correctement le rejet de la première promesse, utilisez .catch() au lieu de .then() :

promise.then(function(data) {
    return new Promise(...);
}, function (reason) {
    console.log("Failed");
});
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal