Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/463.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 拒绝不';不要违背诺言_Javascript_Mysql_Node.js_Promise - Fatal编程技术网

Javascript 拒绝不';不要违背诺言

Javascript 拒绝不';不要违背诺言,javascript,mysql,node.js,promise,Javascript,Mysql,Node.js,Promise,我有两个插入查询,我需要通过事务相互链接,因为有时其中一个查询可能会失败(这是出于设计),我使用承诺来处理接下来发生的事情 new Promise(function(resolve , reject ) { pool.getConnection(function(err, connection) { connection.beginTransaction(function (err) { if (err) {

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

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部分

.catch(function (error) {

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

});
但是承诺中的密码将继续而不是破坏。。。这部分具体

  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
这是我在
捕获
中期望的输出,但在我得到

TypeError: Cannot read property 'insertId' of undefined
被这个代码所迷惑

  resolve(result.insertId);
如果其已被拒绝,为什么仍在运行解析代码?我做错了什么

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

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

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

我做错了什么


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

thanx,我认为拒绝承诺会停止代码的执行。。。有点像抛出一个错误我能理解混乱。在承诺链中,行为如您所述。然而,在
新承诺(…)
构造函数中,您还没有进入承诺链。它只是标准的,同步执行的,逐行的代码。在
.then()
.catch()
回调中,
拒绝()
不再合适。您必须
抛出新错误(…)
。简而言之,
throw
类似于
reject()
return
类似于
resolve()
。换句话说,在
新承诺(…)
构造函数中,调用
resolve()
reject()
。在
then(…)
/
catch(…)
回调中,分别使用关键字
return
throw
。一个小但重要的细节是,通过重新承诺(从
then()
/
catch()
回调),在你的承诺链中,这一阶段的最终结果取决于被回报的承诺的命运。在承诺被归还的时候,即使它的命运不得而知,你所需要做的就是
return
it。承诺永远不需要,也永远不应该被抛弃。