Javascript 异步函数don';t按正确顺序返回值
我想从firestore获取用户数据,但函数的行为与我所希望的不同。 当我运行init函数时,我在控制台中得到了一个响应,比如:“in init”、“after”、“null”、“user is active”,但我希望收到一个响应,比如:“user is active”、“in init”,用户数据而不是null,“after” 我知道这可能很简单,但我整天坐在这个问题上。 我应该怎么做才能按此顺序获取数据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
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();})();不过,问题看起来是另一个:)很高兴你让它工作起来了。它工作起来了,谢谢你,欢迎你。请按回答标记。它有效,谢谢。不客气。请按回答的那样标记。