Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么async await在此函数中不起作用?_Javascript_Async Await - Fatal编程技术网

Javascript 为什么async await在此函数中不起作用?

Javascript 为什么async await在此函数中不起作用?,javascript,async-await,Javascript,Async Await,这可能是一个初学者的问题,但我无法理解: 我正在执行一个异步数据库调用,在该调用中,我希望从数据库中获取一个对象,并将该对象分配给窗口对象(window.naamID) 接下来,我想运行一个函数,在该函数中,我使用分配给窗口对象的对象(使其成为全局对象),并将其用作数据库查询(.where(“Vraagsteller”,“==”,naamID)) 当然,问题是第二个函数在第一个函数建立之前就开始运行(因为它是异步的) 我想通过将第二个函数包装在同步函数中并等待第一个函数来克服这个问题 这似乎不管

这可能是一个初学者的问题,但我无法理解:

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

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

当然,问题是第二个函数在第一个函数建立之前就开始运行(因为它是异步的)

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

这似乎不管用。控制台表示分配给窗口对象的对象未定义

代码如下:

 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*

   });
});

我做错了什么?或者async Wait不是这样工作的吗?

如果
constructMenuFunction
实际上存在于代码中的其他地方,并返回一个承诺,那么您的问题是函数调用中缺少括号:
Wait constructMenuFunction()


如果
constructMenuFunction
在代码的其他地方不存在,并且异步函数前面的第一个函数实际上是您希望调用的函数,那么您的问题是第一个函数没有返回承诺,并且异步函数调用了错误的方法,并且没有括号

async function constructAuthMenu() {
  return await auth.onAuthStateChanged(async User => {
    try {
      const userRef = db.collection("Vitaminders").doc(User.uid);
      const doc = await userRef.get();
      const naamID = doc.data().Gebruikersnaam;
      const ID = doc.data().ID;
      const naam = naamID.replace(ID, "");
      const profilePic = doc.data().Profielfoto;
      return naamID;
    } catch(err) {
      console.error(err);
    }
 });
};

这段代码的错误要多得多,但问题是“async/await是如何工作的”,它只有在实际调用正在等待的异步函数时才起作用。它只有在
await
承诺时才起作用
constructMenuFunction
甚至不存在,
constructAuthMenu
不返回承诺。很抱歉假设代码中的其他地方存在
constructMenuFunction
?阅读问题的文本意味着
constructMenuFunction
constructAuthMenu
的一个打字错误,这让我们回到了一个问题,即它没有返回承诺。您的代码有点难以理解,
constructMenuFunction
指的是什么?是的,我很抱歉。在我把这个问题发布到这里之前,我正在修改代码。我试图将该函数绑定到一个变量(const constructMenuFunction=constructAuthMenu())。我忘了将异步函数中的代码改回wait constructureAuthMenu()。我编辑了这篇文章。
auth.onAuthStateChanged
可能会在每次auth状态更改时激发。你不能用承诺来跟踪这一点,因为它们处理的是一次发生的事情,而这听起来像是可以多次发生的事情。