為什麼第二個 Promise 錯誤處理程序在第一個 Promise 的「失敗」輸出之前執行?

Linda Hamilton
發布: 2024-11-14 09:45:02
原創
644 人瀏覽過

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

Node.js Express 和Promise 未如預期運作

第一個Promise 不等待findUser() 完成

在提供的程式碼中,第一個Promise 不會等待findUser() 回傳後再繼續,因為:

  • .findUser() 使用回呼函數非同步查詢資料庫。
  • 回呼不用於解析承諾。相反,promise 是用行來解析的,這在建立 Promise 時是未定義的。

解決方案:

將資料庫查詢包裝在返回Promise 並解析的函數中帶有查詢結果的承諾:

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
                    }
                });
            }
        });
    });
}
登入後複製

為什麼錯誤處理程序第二個被輸出而不是失敗

第二個承諾的錯誤處理程序被調用,因為第一個承諾被拒絕。但是,console.log(“失敗”);錯誤處理程序中的行未執行,因為 .then() 區塊內拋出了錯誤。

要正確處理第一個 Promise 的拒絕,請使用 .catch() 而不是 .then():

promise.then(function(data) {
    return new Promise(...);
}, function (reason) {
    console.log("Failed");
});
登入後複製

以上是為什麼第二個 Promise 錯誤處理程序在第一個 Promise 的「失敗」輸出之前執行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板