用Mysql更改Javascript Promise

时间:2018-07-31 21:27:34

标签: javascript mysql node.js promise

所以我在兑现承诺时遇到了麻烦,我无法弄清楚。 代码很长,但是我要简化一下。

基本问题是,getDataSet1AndPostToMysql获取一些数据并将值更新到mysql中,之后,我希望getDataAndPerformAction从mysql中获取一些数据,执行一些操作,然后将一些字段更新到mysql中,然后,我想关闭连接。

如果我只执行getDataSet1AndPostToMysql并编写一个.then()来关闭连接,则所有操作都像一个超级按钮。

问题在于,当我将第二个promise函数添加到第一个promise函数时,它不再起作用。

对此有何想法?

谢谢!

function getDataSet1AndPostToMysql(param){
return new Promise((resolve, reject) => {
   //perform some actions with data        
  var sql = "UPDATE urls SET value=1 WHERE data='" + valueX + "'";
  connection.query(sql, function (err, result) {
      if (err) throw err;
  })

   resolve();
   })
}

function getDataAndPerformAction{
    return new Promise ((resolve,reject) => {
    //Get data back from mysql
    //Do things with data      
    var sql = "UPDATE urls SET depth="+depth+1+" WHERE url='" + url + "'";
    connection.query(sql, function (err, result) {
        if (err) throw err;
        console.log("update done")
    })
  
        resolve();
    })

}

getDataSet1AndPostToMysql.then(()=>{
  getDataAndPerformAction()
  }).then(()=>{
  connection.end()
  })

2 个答案:

答案 0 :(得分:1)

您需要在getDataAndPerformAction中从then返回承诺,否则then只会返回未定义,然后下一个then无需等待。

getDataSet1AndPostToMysql.then(()=>{
    return getDataAndPerformAction() // return this
}).then(()=>{
    connection.end()
})

您可以不使用花括号来简化操作:

getDataSet1AndPostToMysql.then(()=> getDataAndPerformAction()) // this implicitly returns
.then(()=> connection.end())

答案 1 :(得分:1)

您需要将结果和错误传递给Promise,并在出现错误的情况下加上处理程序。

function getDataSet1AndPostToMysql(param){
    return new Promise((resolve, reject) => {
        //perform some actions with data        
        var sql = "UPDATE urls SET value=1 WHERE data='" + valueX + "'";
        connection.query(sql, function (err, result) {
            if (err) resolve(err);
            resolve(result);
        });
    });
}
function getDataAndPerformAction() {
    return new Promise ((resolve,reject) => {
        var sql = "UPDATE urls SET depth="+depth+1+" WHERE url='" + url + "'";
        connection.query(sql, function (err, result) {
            if (err) reject(err);
            resolve(result);
        });
    });
}

function cleanup(connection) {
    connection.end();
}
var boundCleanup = cleanup.bind(connection);
getDataSet1AndPostToMysql.then(getDataAndPerformAction)
    .then(boundCleanup, boundCleanup);