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

Linda Hamilton
Lepaskan: 2024-11-14 09:45:02
asal
642 orang telah melayarinya

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
                    }
                });
            }
        });
    });
}
Salin selepas log masuk

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");
});
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan