调用填充数组的函数后为空数组

时间:2019-10-04 09:37:17

标签: node.js promise

我试图在数组中填充函数后获取它,但是当我打印出它时它是空的。

代码:

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

但是,getUsersGroups()中的console.log会打印出已填充的数组,但在app.post('/submitLogin...')中却为空

为什么在我尝试打印数组之前假设getUsersGroups()运行,这会发生什么?

2 个答案:

答案 0 :(得分:2)

您没有观察到数据库调用的异步执行。 console.log(usersList);发生在数据库调用之前,因此为空。

您必须像这样修改代码,并在执行数据库后发布代码:

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这样的全局变量(我从示例中删除了该变量) 因为如果您同时收到两个请求,第二个请求可能会覆盖第一个请求的数据, 会引起很多副作用。

答案 1 :(得分:0)

    app.post('/submitLogin', async function(req,res) {
    await getUsersGroups();
    console.log(usersList);    
});

尝试