console.log () отображает правильное значение, но когда оно присваивается переменной, оно не определено - Angular, firestore - PullRequest
1 голос
/ 29 мая 2019

Я работаю над приложением 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 ]

2 голосов
/ 29 мая 2019

Похоже, что вы не возвращаете Promise из своей функции - в функции getToken нет оператора return вообще, поэтому сама функция просто возвращает undefined. Внутреннее возвращаемое вами заявление разрешит обещание, и это хорошо, но вы должны обработать это разрешение.

Если вы вернете обещание так:

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);
});

Примечание : измененная функция вернет обещание. Поэтому вы не можете просто следующее:

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
0 голосов
/ 29 мая 2019

Это может ответить на ваш вопрос: Невозможно получить доступ к свойству объекта, даже если оно существует. Возвращает undefined

"Вывод console.log (anObject) вводит в заблуждение; состояние отображаемого объекта разрешается только при развертывании> в консоли."

Другими словами, doc.data (). User_token может быть заполнен асинхронным процессом.

...