Dalam kod yang disediakan, yang pertama janji tidak menunggu findUser() kembali sebelum meneruskan kerana:
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 } }); } }); }); }
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!