我具有以下功能:
export function readUserData(userName, password) {
firebase.database().ref("users/" + userName).once("value").then(function (snap) {
//console.log(snap.val().salt);
var verification = passwordVerify(password, snap.val().salt);
//console.log(verification);
//console.log(snap.val().password);
console.log(snap.val());
return snap.exists() && snap.val().password === verification
? userAuth.located = snap.val()
: userAuth.located = false;
});
return userAuth.located;
}
有人告诉我firebase.database()。ref是一个异步函数,在写console.log(snap.val())之前,它返回的是在readUserData的最后一行中的userAuth。 ;
我如何确保在返回最终结果之前执行firebase.database()。ref ...?我不确定如何在此代码中实现wait / promises,因为整体功能不是异步的。
答案 0 :(得分:2)
您应该返回承诺,例如:
export function readUserData(userName, password) {
return firebase.database().ref("users/" + userName)
.once("value")
.then(function (snap) {
var verification = passwordVerify(password, snap.val().salt);
return snap.exists() && snap.val().password === verification
? snap.val()
: false;
});
}
然后,无论哪个代码调用此方法,都应异步等待:
var userAuthLocated = await readUserData(userName, password);
或者,带有承诺:
readUserData(userName, password)
.then(userAuthLocated => {
// use userAuthLocated here
});
答案 1 :(得分:0)
要在@Seaphin上发表您的评论。下一行还需要一步
var userAuthLocated = await readUserData(userName, password);
正在发生的事情是您的应用在更新之前正在使用userAuthLocated。通过readUserData中的firebase调用确实会更新userAuthLocated,但是,您缺少async()函数。
使用await应该总是包装在async()函数调用中。它看起来应该与此类似
userAuth = async () => {
var userAuthLocated = await readUserData(userName, password);
//setstate or
return userAuthLocated
基本上使用异步“块”,直到可以使用该值为止。直到异步功能解除阻止,等待该值的功能才会执行