我有一个代码块,我想在其中连接两个数据库查询的结果。所以我尝试实现Promises.all
const promise_list = []
let appData = [];
let promise = new Promise((resolve, reject) => {
let database = new Database();
database.query(`select * from configuration where version = (select max(version) from configuration) OR version= ? ORDER BY version `, [req.body.app_version])
.then(rows => {
appData=rows[0];
database.close()
resolve()
}, err => {
return database.close().then(() => { throw err; })
})
.catch(err => {
console.log(err);
res.status(500).json("Database Error");
reject()
})
});
promise_list.push(promise)
let promise2 = new Promise((resolve, reject) => {
let database = new Database();
database.query(`select points from users where id=?`, [req.user.id])
.then(rows => {
appData.points=rows[0]['points'];
database.close()
resolve()
}, err => {
return database.close().then(() => { throw err; })
})
.catch(err => {
console.log(err);
res.status(500).json("Database Error");
reject()
})
});
promise_list.push(promise2)
Promise.all(promise_list).then(result => {
res.status(200).json(appData);
});
第二个查询有时有效,有时却无效。可能是什么问题?
答案 0 :(得分:2)
appData.points=rows[0]['points'];
仅在appData
已被另一个诺言首先初始化的情况下有效。但是使用Promise.all
,任何一个承诺都可以首先解决。如果第一个承诺第二次解决,它将简单地覆盖appData
当前具有的任何值。
您似乎错误地使用了诺言。您应该正确地解决它们,而不是将它们用于副作用(分配给appData
)。
可以将整个代码清除很多,如下所示:
let database = new Database();
let promise = database.query(`select * from configuration where version = (select max(version) from configuration) OR version= ? ORDER BY version `, [req.body.app_version])
.then(rows => rows[0]);
let promise2 = database.query(`select points from users where id=?`, [req.user.id])
.then(rows => rows[0].points);
Promise.all([promise, promise2])
.then(
([appData, points]) => {
appData.points = points;
res.status(200).json(appData);
},
err => {
console.log(err);
database.close().then(() => {
res.status(500).json("Database Error");
});
}
);
不知道Database
的作用,因此不清楚只调用一次是否可以。但这应该是一个更好的如何使用Promise的想法。