所以我在兑现承诺时遇到了麻烦,我无法弄清楚。 代码很长,但是我要简化一下。
基本问题是,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()
})
答案 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);