为什么异步等待在此功能中不起作用?

时间:2020-09-01 19:54:20

标签: javascript async-await

这可能是一个初学者的问题,但我无法弄清楚:

我正在执行异步数据库调用,在该调用中,我想从数据库中获取一个对象并将该对象分配给窗口对象(window.naamID)。

接下来,我想运行一个函数,在该函数中,我使用分配给window对象的对象(使其成为全局对象)并将其用作数据库查询(.where(“ Vraagsteller”,“ ==”,naamID))。 / p>

当然,问题在于第二个函数在第一个函数完成之前开始运行(因为它具有异步特性)。

我想通过将第二个函数包装在一个同步函数中并等待第一个函数来克服这个问题。

这似乎没有用。控制台说分配给窗口对象的对象是未定义的。

Snapshot of console log

这是代码:

 function constructAuthMenu(){
auth.onAuthStateChanged(User =>{

    const userRef = db.collection("Vitaminders")
    .doc(User.uid);
    userRef.get()
    .then(function(doc) {

        const naamID = doc.data().Gebruikersnaam;
        const ID = doc.data().ID
        const naam = naamID.replace(ID, "")
        const profilePic = doc.data().Profielfoto

        window.naamID = naamID
     });
  });
}; 

constructAuthMenu()

 async function getNewReactions(){

        await constructAuthMenu()

      db.collectionGroup("Reactions")
      .where("Vraagsteller", "==", naamID)
      .where("New", "==", 
       "Yes").get().then(querySnapshot => {
        querySnapshot.forEach(doc => {

       *Do stuff*

   });
});

我在做什么错?还是不是异步等待这样的工作?

1 个答案:

答案 0 :(得分:0)

如果+----+----------+ | id | username | +----+----------+ | 1 | admin | +----+----------+ 1 row in set (0.00 sec) 实际上存在于代码中的其他位置,并返回一个Promise,则您的问题是您在函数调用上缺少括号:constructMenuFunction

如果await constructMenuFunction();在代码的其他地方不存在,而async函数之前的第一个函数实际上是您希望调用的函数,则您的问题是第一个函数没有返回Promise且您的异步函数调用了错误的方法,没有括号。

constructMenuFunction
相关问题