Maison >base de données >tutoriel mysql >Pourquoi ma promesse est-elle résolue prématurément dans Node.js avec Express et Promises ?

Pourquoi ma promesse est-elle résolue prématurément dans Node.js avec Express et Promises ?

DDD
DDDoriginal
2024-11-17 15:32:02936parcourir

Why Does My Promise Resolve Prematurely in Node.js with Express and Promises?

Node.js Express et promesses : résoudre un comportement imprévisible

Cause d'une promesse non attendue

Dans votre code, la promesse créée pour la fonction findUser s'exécute immédiatement, mais la fonction elle-même est asynchrone. Par conséquent, la promesse se résout prématurément avant que findUser puisse récupérer des données.

Mise en œuvre d'une bonne exécution de la promesse

Modifiez votre fonction findUser pour renvoyer une promesse au lieu d'essayer de renvoyer des valeurs de manière synchrone. Voici un exemple :

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

    return new Promise(function (resolve, reject) {

      pool.getConnection(function (err, connection) {
        if (err) {
          reject(err);
          return;
        }

        connection.query('select Id, Name, Password from Users ' +
            'where Users.Name = ?', [username], function (err, rows) {
            connection.release();
            if (err) {
                reject(err);
            } else {
                resolve(rows);
            }
        });
      });
    });
}

Gestion des erreurs

Le message « gestionnaire d'erreurs deuxième » apparaît car le gestionnaire d'erreurs de la deuxième promesse est rejeté lorsque findUser rencontre une erreur. Pour résoudre ce problème, modifiez le code comme suit :

promise.then(function(data) {
            return new Promise(function (resolve, reject) {
                loginC.doSomething(data);

                if (success) {
                    console.log("Success 2");
                    resolve(data);
                } else {
                    console.log("Failed 2");
                    reject("Error in doSomething");
                }
            });
        }).catch(function (reason) {
            console.log("Error in findUser: " + reason);
        });

Notes supplémentaires

  • Assurez-vous de gérer les erreurs de connexion à la base de données dans le rappel de connexion.
  • Évitez de vous fier sur les méthodes synchrones pour les opérations asynchrones.
  • Les promesses sont utilisées pour enchaîner les opérations asynchrones et gérer les résultats de manière fiable.

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