我正在使用Angular应用程序,并希望从Firestore中获取一些数据。但是我的函数总是返回undefined
。但是,当我在返回值之前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!
}
});
}
两个值不应该相同吗?
答案 0 :(得分:2)
似乎您没有从函数中返回Promise
-getToken
函数中根本没有return语句,因此该函数本身仅返回undefined
。您拥有的内部return语句将解决诺言,这很好,但是您必须处理该决议。
如果您像这样返回承诺:
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;
}
});
}
通过以下承诺,您应该能够异步访问user_token
:
getToken(user_id).then(user_token => {
handle_user_token_here(user_token);
});
注意:修改后的函数将返回promise。因此,您不能简单地执行以下操作:
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
答案 1 :(得分:0)
这可能会回答您的问题:Can't access object property, even though it exists. Returns undefined
“ console.log(anObject)的输出具有误导性;仅当您在控制台中展开>时,才能解决所显示对象的状态。”
换句话说,doc.data()。user_token可能会被异步进程填充。