开发者问题收集

无法在异步函数中返回值

2021-10-12
155

我有一个专门用于处理 React Native App 身份验证功能的文件。其中一个函数 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 。我无法从承诺函数返回令牌值。我尝试在 auth.onAuthStateChanged 上使用 return ,但这会导致 token 评估为 [Function Bound] 。在 auth.onAuthStateChanged 上使用 await 也没有任何作用。我真的被难住了。

2个回答

您必须在代码中显示的另外两个地方返回。请使用此修改进行回复,让我们 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);
                    }
                )
        }
    });
}
Vivek Vs
2021-10-12

虽然我不再使用这个代码片段,但我能够像这样解决它:

getJWToken 
export const getJWToken =  async () => {
 let result;
 // await is needed here
  await auth.onAuthStateChanged(function(user) {
      if (user) {
          console.log("user")
          // save this promise to result
          result = user.getIdToken()
              .then(function(idToken) {
                  return idToken;
              })
              .catch(
                  (error) => {
                      console.log("Cannot get User Token: ", error);
                  }
              )
      }

});
// return the user.getToken() promise
return result
Jevon Cowell
2022-02-20