Javascript log()显示正确的值,但当将其分配给变量时,它是未定义的-Angular,firestore

Javascript log()显示正确的值,但当将其分配给变量时,它是未定义的-Angular,firestore,javascript,function,asynchronous,promise,google-cloud-firestore,Javascript,Function,Asynchronous,Promise,Google Cloud Firestore,我正在开发一个Angular应用程序,希望从Firestore获取一些数据。但是我的函数总是返回未定义的。但是,当我在返回值之前输入console.log()值时,它会显示正确的值 getToken(user_id) { this.afs.collection("tokens").ref.doc(user_id).get().then((doc) => { if (doc.exists) { console.log(doc.data().user_tok

我正在开发一个Angular应用程序,希望从Firestore获取一些数据。但是我的函数总是返回未定义的
。但是,当我在返回值之前输入console.log()
值时,它会显示正确的值

getToken(user_id) {
    this.afs.collection("tokens").ref.doc(user_id).get().then((doc) => {
      if (doc.exists) {
        console.log(doc.data().user_token); //displays the correct user_token value
        return doc.data().user_token; //returns undefined!
      }
    });
}

这两个值不应该相同吗?

这可能会回答您的问题:

“console.log(anObject)的输出有误导性;只有在控制台中展开>时,才会解析显示的对象的状态。”


换句话说,doc.data().user_令牌可能正在被异步进程填充。

您似乎没有从函数返回
承诺
——在
getToken
函数中根本没有返回语句,因此函数本身只返回
未定义
。您拥有的内部返回语句将解决承诺问题,这很好,但您必须处理该解决方案

如果你像这样回报承诺:

getToken(user_id) {
    return this.afs.collection("tokens").ref.doc(user_id).get().then((doc) => {
      if (doc.exists) {
        console.log(doc.data().user_token); //displays the correct user_token value
        return doc.data().user_token;
      }
    });
}
当承诺通过执行以下操作解决时,您应该能够异步访问
用户\u令牌

getToken(user_id).then(user_token => {
  handle_user_token_here(user_token);
});
let user_token = getToken(user_id);
// user_token here is a Promise object, not the token!
handle_user_token_here(user_token); // will not work.
注意:修改后的函数将返回一个承诺。因此,您不能简单地执行以下操作:

getToken(user_id).then(user_token => {
  handle_user_token_here(user_token);
});
let user_token = getToken(user_id);
// user_token here is a Promise object, not the token!
handle_user_token_here(user_token); // will not work.
但您可以这样做:

let user_token = getToken(user_id);
// user_token here is a Promise object, not the token!
user_token.then(user_token => handle_user_token_here(user_token)); // will work

你没有兑现你的承诺。在
这个.afs.collection(“tokens”)
前面放一个
return
。另外,请显示您如何使用
getToken()
。我尝试了以下方法:
getToken(用户\u id)。然后(用户\u令牌=>{let token=user\u token.data.user\u token;})但是当我记录令牌时,它仍然返回未定义的。您在哪里记录令牌?如果您这样做了:
getToken(user_id)。然后(user_token=>{let token=user_token.data.user_token;console.log(token);})它应该可以工作(假设您通过添加return语句修改了
getToken
)。如果您这样做:
getToken(user\u id.),然后(user\u token=>{let token=user\u token.data.user\u token;});console.log(令牌)
您可能试图在函数范围之外使用
令牌
,但这行不通;SignInsAccess(){this.tokenService.getToken(user_id.),然后((user_token)=>{this.token=user_token.data().user_token;});console.log(this.token);}
(home.page.ts文件中HomePage类中的所有内容),是的,我确实修改了
getToken()
了您建议的仍然不起作用的方式,as
getToken
(以及任何涉及承诺的函数)是异步的。在代码中分配此.token后,您正在访问该.token,但不是在
承诺
解析后。
Promise
可能需要几秒钟才能解决,为了在等待请求完成时不停止所有代码,代码会立即继续。