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。承诺永远不需要,也永远不应该被抛弃。