解决所有承诺

时间:2018-11-19 07:30:18

标签: javascript node.js promise

我有一个代码块,我想在其中连接两个数据库查询的结果。所以我尝试实现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);
});

第二个查询有时有效,有时却无效。可能是什么问题?

1 个答案:

答案 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的想法。