【问题标题】:reject doesn't break the promise operation拒绝不会破坏承诺操作
【发布时间】:2020-10-03 14:42:08
【问题描述】:

我有 2 个插入查询,我需要通过事务相互链接,因为有时其中一个查询可能会失败(这是设计使然),我使用 promise 来处理接下来发生的事情

new Promise(function(resolve , reject ) {
        pool.getConnection(function(err, connection) {
            connection.beginTransaction(function (err) {
                if (err) {
                    reject(err.sqlMessage);
                }
                connection.query('INSERT INTO main_table  SET ?', main_table_data, function (err, result) {
                    if (err) {
                        connection.rollback(function () {
                            reject(err.sqlMessage)
                        });
                    }

                    connection.query('INSERT INTO child_table  SET ?', child_table_data, function (err, result) {
                        if (err) {
                            connection.rollback(function () {
                                reject(err.sqlMessage)
                            });
                        }
                        connection.commit(function (err) {
                            if (err) {
                                connection.rollback(function () {
                                    reject(err.sqlMessage)
                                });
                            }
                            resolve(result.insertId);
                        });
                    });
                });
            });
        });
    })

.then(function (ID) {

        console.log('/////////SUCCESS/////////////');
        console.log(ID);

})
.catch(function (error) {

    console.log('/////////ERROR/////////////');
    console.log(error);

});

问题是我无法阻止它破坏整个代码,它执行捕获部分

.catch(function (error) {

    console.log('/////////ERROR/////////////');
    console.log(error);

});

但是promise里面的代码会继续运行而不是破坏……这部分特别是

  resolve(result.insertId);

这是我的输出

/////////ERROR/////////////
invalid wallet
C:\wamp64\www\expbet\serv\node_modules\mysql\lib\protocol\Parser.js:437
      throw err; // Rethrow non-MySQL errors

这是我在catch 中期望的输出,但在我得到之后

TypeError: Cannot read property 'insertId' of undefined

受此代码影响

  resolve(result.insertId);

如果它已被拒绝,为什么它仍在运行解析代码?我做错了什么

第二个错误破坏了整个节点代码,如果这不是拒绝的工作方式,我需要抛出一个错误,我怎么能在不破坏整个代码的情况下做到这一点并在 promise catch 中捕获它?

【问题讨论】:

    标签: javascript mysql node.js promise


    【解决方案1】:

    如果它已经被拒绝,为什么它仍在运行解析代码?

    看看你的if(err) { reject(err.sqlMessage); } 子句。它们都没有else {} 子句,因此执行将继续,就好像没有错误一样。

    我做错了什么?

    您假设在 nodebacks 中发生错误和/或调用 connection.rollback() 和/或调用 reject() 将阻止代码的进一步执行。事实并非如此。

    【讨论】:

    • thanx ,我认为通过拒绝承诺将停止代码的执行......有点像抛出错误
    • 我能理解这种困惑。在承诺链中,行为如您所描述。但是,在 new Promise(...) 构造函数中,您还没有进入承诺链。它只是标准的、同步执行的、逐行的代码。
    • 那种。在.then().catch() 回调中,reject() 不再适用。您必须改为throw new Error(...)。简而言之,throw 类似于reject()return 类似于resolve()
    • 换句话说,在new Promise(...) 构造函数中,您调用resolve()reject()。在then(...)/catch(...) 回调中,您分别使用关键字returnthrow
    • 一个小而重要的细节是,通过返回一个 Promise(来自 then()/catch() 回调),你的 Promise 链中该阶段的最终结果取决于返回的命运承诺。在 Promise 返回的时候,即使它的命运未知,你需要做的只是return它。 Promise 永远不需要也不应该被抛出。
    猜你喜欢
    • 2018-12-02
    • 2022-12-04
    • 1970-01-01
    • 2015-12-25
    • 2017-12-29
    • 2020-06-13
    • 2019-11-25
    • 2014-01-09
    • 2013-04-28
    相关资源
    最近更新 更多