提问者:小点点

在迭代数据并将其推送到数组后,数组为空


我尝试从DB迭代数据,然后将该数据推送到数组。 我做了2个console.log:1个在循环内,另一个在循环外。 但是,循环之外的一个循环首先被打印为一个空数组。 但为什么会出现这种情况,又是如何出现的呢? 一切看起来都很好:(需要帮助,请!

这就是我所拥有的:

app.get(“/greybook/:bookid”,(req,res)=>{

常量usernameArr=[];

book.findById(req.params.bookId,(error,foundBook)=>{

for(让Foundbook.Associates的关联){

User.FindById(associate,(error,foundUser)=>{

USERNAMEARR.PUSH(FoundUser.UserName);

console.log(usernameArr); //第一台控制台。请在此处记录。。。

});

}

console.log(usernameArr); //第二台控制台。请在此处记录。。。

Res.Render(“Greybook/GreybookShow”,{book:foundBook,Associates:usernameArr});

});

});

这是控制台的输出:

[]

['grey_ghost']

[“Grey_Ghost”,“Gerry”]

[“grey_ghost”,“gerry”,“ghost”]


共1个答案

匿名用户

这是因为book.findById中的回调不会等待对user.findById的异步调用,因为此时已经解析了。 我将使用async/await重写它,这样可以避免“回调地狱”并更容易地查看代码流。 请尝试以下操作:

null

app.get("/greybook/:bookid", async (req, res) => {
  const usernameArr = [];
  let foundBook = await Book.findById(req.params.bookid);
  for (let associate of foundBook.associates) {
    let foundUser = await User.findById(associate);
    usernameArr.push(foundUser.username);
    console.log(usernameArr); // 1st console.log here...
  });
  console.log(usernameArr); // 2nd console.log here...
  res.render("greybook/greybookshow", {
    book: foundBook,
    associates: usernameArr
  });
});

相关问题