Javascript 异步函数don';t按正确顺序返回值

Javascript 异步函数don';t按正确顺序返回值,javascript,firebase,asynchronous,google-cloud-firestore,Javascript,Firebase,Asynchronous,Google Cloud Firestore,我想从firestore获取用户数据,但函数的行为与我所希望的不同。 当我运行init函数时,我在控制台中得到了一个响应,比如:“in init”、“after”、“null”、“user is active”,但我希望收到一个响应,比如:“user is active”、“in init”,用户数据而不是null,“after” 我知道这可能很简单,但我整天坐在这个问题上。 我应该怎么做才能按此顺序获取数据 init() async function init () { await

我想从firestore获取用户数据,但函数的行为与我所希望的不同。 当我运行init函数时,我在控制台中得到了一个响应,比如:“in init”、“after”、“null”、“user is active”,但我希望收到一个响应,比如:“user is active”、“in init”,用户数据而不是null,“after”

我知道这可能很简单,但我整天坐在这个问题上。 我应该怎么做才能按此顺序获取数据

init()

async function init () {
     await userIsActive()
    console.log("in init");     
  await getDaySpending();
    console.log("after") */
    
}

function userIsActive(){
    firebaseApp.auth().onAuthStateChanged( user=>{
    if(user){
      console.log("user is active");
      return true
    }else{
      console.log("no user");
      return false
    }
  })
  }

 function getDaySpending(period = '7-2020') {
    const user = firebase.auth().currentUser;
     console.log(user)    //I got null instead user data
    if(!user) return;      
    const uid = user.uid;
    const snap  = await  firebase.firestore().collection(uid).doc(period).get();
    if(snap.exists) {
      return snap.data().spending;
    } else {
      // handle the case where there was no data
    }
  }

init
函数为
async
如果不存在
wait
,则不会暂停执行,然后将以非阻塞方式执行代码。添加关键字
等待

Mozilla文档:

异步函数可以包含一个等待表达式,用于暂停 执行异步函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值


init
函数为
async
如果不存在
wait
,则不会暂停执行,然后将以非阻塞方式执行代码。添加关键字
等待

Mozilla文档:

异步函数可以包含一个等待表达式,用于暂停 执行异步函数并等待传递的承诺 解析,然后恢复异步函数的执行和 返回已解析的值


问题在于userIsActive函数。不能从封闭函数中返回值

// This function returns undefined
function asd() {
  (() => { return 1; })();
}
在这种情况下,假设您正确地使用了我不熟悉的firebase api,则需要使用明确的承诺

function userIsActive(){
  return new Promise((resolve, reject) => 
    firebaseApp.auth().onAuthStateChanged( user=>{
    if(user){
      console.log("user is active");
      return resolve(true)
    } else{
      console.log("no user");
      return resolve(false);
    }
 })
}

我怀疑这不是使用此api的正确方法,但希望有更熟悉此主题的人可以插话。

问题在于userIsActive函数。不能从封闭函数中返回值

// This function returns undefined
function asd() {
  (() => { return 1; })();
}
在这种情况下,假设您正确地使用了我不熟悉的firebase api,则需要使用明确的承诺

function userIsActive(){
  return new Promise((resolve, reject) => 
    firebaseApp.auth().onAuthStateChanged( user=>{
    if(user){
      console.log("user is active");
      return resolve(true)
    } else{
      console.log("no user");
      return resolve(false);
    }
 })
}

我怀疑这不是使用此api的正确方式,但希望有更熟悉此主题的人可以加入。

代码中没有“null”日志,您是说“无用户”?我无意中删除了日志。是的,我得到了空。代码中没有“空”日志,你是说“没有用户”?我无意中删除了日志。是的,我有空,我应该把等待关键字放在哪里?你能纠正我的函数吗?你叫它在哪里
await init()
当我在init()之前添加wait时,我得到了一个错误:意外的保留字,这是因为您不是在异步函数中调用它,而是在主文件中调用它。试试这个:(异步函数(){await init();})();然而,问题看起来是另一个:)很高兴你让它工作。我应该把等待关键字放在哪里?你能纠正我的函数吗?你叫它在哪里
await init()
当我在init()之前添加wait时,我得到了一个错误:意外的保留字,这是因为您不是在异步函数中调用它,而是在主文件中调用它。试试这个:(异步函数(){await init();})();不过,问题看起来是另一个:)很高兴你让它工作起来了。它工作起来了,谢谢你,欢迎你。请按回答标记。它有效,谢谢。不客气。请按回答的那样标记。