Javascript log()显示正确的值,但当将其分配给变量时,它是未定义的-Angular,firestore
我正在开发一个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
。但是,当我在返回值之前输入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()
了您建议的仍然不起作用的方式,asgetToken
(以及任何涉及承诺的函数)是异步的。在代码中分配此.token后,您正在访问该.token,但不是在承诺
解析后。Promise
可能需要几秒钟才能解决,为了在等待请求完成时不停止所有代码,代码会立即继续。