Heim >Datenbank >MySQL-Tutorial >Warum wird der Fehlerhandler des zweiten Versprechens vor der „fehlgeschlagenen' Ausgabe des ersten Versprechens ausgeführt?

Warum wird der Fehlerhandler des zweiten Versprechens vor der „fehlgeschlagenen' Ausgabe des ersten Versprechens ausgeführt?

Linda Hamilton
Linda HamiltonOriginal
2024-11-14 09:45:02741Durchsuche

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

Node.js Express und Promises verhalten sich nicht wie erwartet

Erstes Versprechen wartet nicht auf den Abschluss von findUser()

Im bereitgestellten Code das erste Das Versprechen wartet nicht auf die Rückkehr von findUser(), bevor fortgefahren wird, weil:

  • .findUser() die Datenbank asynchron mithilfe einer Rückruffunktion abfragt.
  • Der Rückruf wird nicht zum Auflösen des Problems verwendet versprechen. Stattdessen wird das Versprechen mit Zeilen aufgelöst, die zum Zeitpunkt der Versprechenserstellung undefiniert sind.

Lösung:

Schließen Sie die Datenbankabfrage in eine Funktion ein, die ein Versprechen zurückgibt und auflöst das Versprechen mit dem Abfrageergebnis:

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

Warum der zweite Fehlerhandler ausgegeben statt fehlgeschlagen wird

Der Fehlerhandler für das zweite Versprechen wird aufgerufen, weil das erste Versprechen abgelehnt wird. Die Datei console.log("Failed"); Zeile im Fehlerhandler wird nicht ausgeführt, da ein Fehler innerhalb des .then()-Blocks ausgelöst wird.

Um die Ablehnung des ersten Versprechens korrekt zu handhaben, verwenden Sie .catch() anstelle von .then():

promise.then(function(data) {
    return new Promise(...);
}, function (reason) {
    console.log("Failed");
});

Das obige ist der detaillierte Inhalt vonWarum wird der Fehlerhandler des zweiten Versprechens vor der „fehlgeschlagenen' Ausgabe des ersten Versprechens ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn