Rumah >pangkalan data >tutorial mysql >Mengapa Pengendali Ralat Janji Kedua Dilaksanakan Sebelum Output 'Gagal' Janji Pertama?

Mengapa Pengendali Ralat Janji Kedua Dilaksanakan Sebelum Output 'Gagal' Janji Pertama?

Linda Hamilton
Linda Hamiltonasal
2024-11-14 09:45:02743semak imbas

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

Node.js Express dan Janji Tidak Berkelakuan Seperti Yang Diharapkan

Janji Pertama Tidak Menunggu FindUser() Selesai

Dalam kod yang disediakan, yang pertama janji tidak menunggu findUser() kembali sebelum meneruskan kerana:

  • .findUser() menanyakan pangkalan data menggunakan fungsi panggil balik secara tak segerak.
  • Panggil balik tidak digunakan untuk menyelesaikan janji. Sebaliknya, janji diselesaikan dengan baris, yang tidak ditentukan pada masa penciptaan janji.

Penyelesaian:

Balut pertanyaan pangkalan data dalam fungsi yang mengembalikan janji dan selesaikan janji dengan hasil pertanyaan:

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

Mengapa pengendali ralat kedua dikeluarkan dan bukannya Gagal

Pengendali ralat untuk janji kedua dipanggil kerana janji pertama ditolak. Walau bagaimanapun, console.log("Gagal"); baris dalam pengendali ralat tidak dilaksanakan kerana ralat dilemparkan ke dalam blok .then().

Untuk mengendalikan penolakan janji pertama dengan betul, gunakan .catch() dan bukannya .then():

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

Atas ialah kandungan terperinci Mengapa Pengendali Ralat Janji Kedua Dilaksanakan Sebelum Output 'Gagal' Janji Pertama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn