【问题标题】:Can't return value inside Async Function无法在异步函数中返回值
【发布时间】: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


【解决方案1】:

您必须在另外两个地方返回,如代码所示。请回复此修改,让我们c

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 () => {
   return  auth.onAuthStateChanged(function(user) {
        if (user) {
           return  user.getIdToken()
                .then(function(idToken) {
                    return idToken;
                })
                .catch(
                    (error) => {
                        console.log("Cannot get User Token: ", error);
                    }
                )
        }
    });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2020-09-12
    相关资源
    最近更新 更多