Пустой массив после вызова функции, заполняющей массив - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь получить массив после того, как он заполнен функцией, но он пуст, когда я его распечатываю.

Код:

var usersList = [];
app.post('/submitLogin',function(req,res) {
    getUsersGroups();
    console.log(usersList);    
});

function getUsersGroups() {
    const users = new Promise((resolve, reject) => {
        dbConnection
        .getUsers()
        .then(data => {
            resolve(data)
        })
    });
    const groups = new Promise((resolve, reject) => {
        dbConnection
        .getGroups()
        .then(data => {
            resolve(data)
        })
    });
    Promise.all([users, groups])
    .then(data => {
        usersList = data[0];
        groupsList = data[1];
        console.log(usersList)
    });
}

Однако console.logв getUsersGroups() распечатывает заполненный массив, но он пуст в app.post('/submitLogin...')

Почему это происходит при условии, что getUsersGroups() выполняется до того, как я пытаюсь распечатать массив?

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Вы не наблюдаете асинхронное выполнение вашего вызова БД. console.log(usersList); происходит ДО вызова db, поэтому он пуст.

Вы должны адаптировать свой код следующим образом и опубликовать код ПОСЛЕ выполнения db:

app.post('/submitLogin', function (req, res) {
  getUsersGroups().then((data) => {
    console.log(data)
    res.send(data.usersList)
  })
})

function getUsersGroups () {
  const users = new Promise((resolve, reject) => {
    dbConnection
      .getUsers()
      .then(data => {
        resolve(data)
      })
  })
  const groups = new Promise((resolve, reject) => {
    dbConnection
      .getGroups()
      .then(data => {
        resolve(data)
      })
  })
  return Promise.all([users, groups])
    .then(data => {
      console.log(data[0])
      return {
        usersList: data[0],
        groupsList: data[1]
      }
    })
}

Я настоятельно рекомендуюне изменяйте глобальную переменную, такую ​​как usersList (которую я удалил из моего примера), потому что, если вы получите два запроса одновременно, второй может перезаписать данные первого и вызвать много побочных эффектов.

0 голосов
/ 04 октября 2019
    app.post('/submitLogin', async function(req,res) {
    await getUsersGroups();
    console.log(usersList);    
});

попробуйте

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