Maison >base de données >tutoriel mysql >Pourquoi le gestionnaire d'erreurs de la deuxième promesse est-il exécuté avant la sortie « Échec » de la première promesse ?

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
Linda Hamiltonoriginal
2024-11-14 09:45:02743parcourir

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
                    }
                });
            }
        });
    });
}

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");
});

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!

Déclaration:
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