首页 > 解决方案 > 在承诺链中停止另一个 .then() 执行

问题描述

我在nodejs和mysql中有程序,如下所示

db.query()
   .then(1)
   .then(2)
   .then(3)
   .catch()

我正在检查数据库中的值then(1)并尝试从那里返回响应。在then(2),我正在执行另一个代码,该代码使用来自结果的一些数据,then(1) 依此类推。

我的问题:当返回响应时then(1)catch()正在调用(因为then(2)有错误,没有从中获取数据then(1))。那么有什么办法可以阻止进一步执行并且then(1)无法调用?then(2)catch()

db.query('query......', [val1, val2])
.then(rslt => { return res.json({ mssg: "Email already exists!", error: "Email already exists!" }) }) 
.then(user => { return db.query('INSERT INTO ', value, (err, res, flds) => { err ? reject(err) : resolve(res) }) })
.then(user => { return res.json({ mssg: "Success", success: true}) })
.catch( (err) => { console.log(err) })

标签: mysqlnode.jspromise

解决方案


您可以(并且应该)使用异步函数,而不是使用 Promise 对象的低级.then()API:

async function doTheThing() {
  try {
    const result = await db.query('...');
    if (result) { // user exists
      return res.json({...}); // this will end the entire function
    }
    const user = await db.query('...');
    return res.json({...}); // success
  } catch (err) {
    console.log(err); // I don't recommend doing this. try/catch should be for recovery
  }
}

推荐阅读