简体   繁体   English

解决所有承诺

[英]Issue resolving all promises

I have a code block where I want to concatenate results of two database queries. 我有一个代码块,我想在其中连接两个数据库查询的结果。 So I tried implementing Promises.all 所以我尝试实现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);
});

The second query works sometimes and sometimes it doesnt. 第二个查询有时有效,有时却无效。 What could be the issue? 可能是什么问题?

appData.points=rows[0]['points']; only works if appData has been initialized by the other promise first. 仅当appData已由其他诺言首先初始化时才有效。 But with Promise.all , either promise can be resolved first. 但是使用Promise.all ,任何一个承诺都可以首先解决。 If the first promise resolve second, it will simply override whatever value appData currently has. 如果第一个承诺第二次解决,它将简单地覆盖appData当前具有的任何值。

It looks like you are using promises incorrectly. 看来您使用的诺言不正确。 Instead of using them with side-effects (assigning to appData ), you should resolve them properly. 不应将它们与副作用(分配给appData )一起使用,而应正确解决它们。

The whole code can be cleaned up a lot to something like this: 整个代码可以清理成如下形式:

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");
      });
    }
  );

Don't know what Database does, so it's not clear whether it's OK to only call it once. 不知道Database做什么,因此不清楚只调用一次是否可以。 But it should you a better idea for how to use promises. 但这应该是您如何使用诺言的更好的主意。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM