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
Libérer: 2024-11-17 15:32:02
original
962 Les gens l'ont consulté

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);
            }
        });
      });
    });
}
Copier après la connexion

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);
        });
Copier après la connexion

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!

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal