Проблема решает все обещания - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть блок кода, в котором я хочу объединить результаты двух запросов к базе данных. Поэтому я попытался реализовать 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 голосов
/ 19 ноября 2018

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, поэтому неясно, можно ли звонить только один раз.Но вам лучше понять, как использовать обещания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...