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

时间:2019-05-29 16:50:40

标签: javascript function asynchronous promise google-cloud-firestore

我正在使用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!
      }
    });
}

两个值不应该相同吗?

2 个答案:

答案 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可能会被异步进程填充。