verifyUser
等待verifyUserSignInSuccess
等待userSnapshot
等待user
这两个函数在ReactNative应用程序的正确性,内存,时间方面会更有效:
export function verifyUser() {
return async dispatch => {
dispatch(verifyUserSignInRequest());
try {
const user = await firebase.auth().onAuthStateChanged();
if (user) {
let userRef = "/user/" + user.uid;
const userSnapshot = await firebase
.database()
.ref(userRef)
.once("value");
dispatch(verifyUserSignInSuccess(userSnapshot.val()));
} else {
dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN));
}
} catch (e) {
dispatch(verifyUserSignInFailure(e.message));
}
};
}
或嵌套异步等待:
export function verifyUser() {
return async dispatch => {
dispatch(verifyUserSignInRequest());
try {
await firebase.auth().onAuthStateChanged(async user => {
if (user) {
let userRef = "/user/" + user.uid;
await firebase
.database()
.ref(userRef)
.once("value")
.then( () => {
dispatch(verifyUserSignInSuccess(userSnapshot.val()));
});
} else {
dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN));
}
});
} catch (e) {
dispatch(verifyUserSignInFailure(e.message));
}
};
}
答案 0 :(得分:2)
时间 - 由于你所有的异步函数都需要一个接着一个地运行,无论你使用async / await或者承诺链接的方法,或两者的混合只需要相同的时间。
正确性 - 两者在逻辑上都是正确的并且将起作用。但async / await是JS解决promise链接问题的最新成员。承诺链接使代码难以阅读。更好的U坚持async / await。对于你需要并行运行两个异步函数的情况,使用await Promise.all()
等。最后,这是你的个人偏好。
存储器? - 我不知道那个
在github上免费阅读本书,其中包含有关promises,异步函数,async / await等的详细信息。 https://github.com/getify/You-Dont-Know-JS
答案 1 :(得分:2)
根据documentation,onAuthStateChanged()
函数返回
观察者的取消订阅功能。
所以你可以:
var unsubscribe = firebase.auth().onAuthStateChanged((user) {
// handle it for changes signed in, signed out, or when the user's ID token changed in situations such as token expiry or password change
});
然后:
unsubscribe();
用于注册观察员。
onAuthStateChanged
是一个Observer,当用户登录,注销或用户的ID令牌在令牌过期或密码更改等情况下发生更改时,会调用观察者。所以第二个是最好的解决方案。每次登录或更改。
` let userRef = "/user/" + user.uid;
await firebase
.database()
.ref(userRef)
.once("value")
.then( () => {
dispatch(verifyUserSignInSuccess(userSnapshot.val()));
});
} else {
dispatch(verifyUserSignInFailure(USER_NOT_SIGNED_IN));
}`
交叉检查是否正确用户是否有效。我不认为需要进行内存比较。