【发布时间】:2021-11-30 20:51:40
【问题描述】:
我有一个文件专门用于处理我的 React Native 应用程序的身份验证功能。其中一个函数getJWToken 是一个匿名异步函数,它尝试通过以下方式获取当前用户令牌:
const auth = db.auth()
// db === (Firebase.apps.length === 0 ? Firebase.initializeApp(config) : Firebase.app())
// the configuration of the Firebase DB occurs in a config file and db is exported.
const getJWToken = async () => {
auth.onAuthStateChanged(function(user) {
if (user) {
user.getIdToken()
.then(function(idToken) {
return idToken;
})
.catch(
(error) => {
console.log("Cannot get User Token: ", error);
}
)
}
});
}
通过console.log,我可以看到该函数按预期返回了令牌。当我在另一个文件的另一个异步函数中使用它时,问题就出现了:
服务文件夹 index.js
import * as Auth from './AuthServices'
export {Auth}
App.tsx
// App.tsx
import {Auth} from './src/services'
// The rest in inside an Async Function
signOut: async () => {
let token
token = await Auth.getJWToken()
console.log("token: ", token) // results in undefined
}
令牌结果为undefined。我无法从 promise 函数返回令牌值。我尝试在auth.onAuthStateChanged 上使用return,但这会导致令牌评估为[Function Bound]。 await on auth.onAuthStateChanged 也没有任何作用。我真的被难住了。
【问题讨论】:
-
不确定 Promise 是否是最好的用途。 (1) 如果您正在获取 idToken,您可能想要
onIdTokenChanged而不是onAuthStateChanged。 (2) 每次发生变化时都会触发——一个promise只能解析一个值一次。您应该监听此事件并将结果存储在某处。然后,getJWToken()可以获取您缓存令牌的任何位置。
标签: javascript firebase react-native promise firebase-authentication