Я работаю над приложением Angular и хочу получить данные из Firestore. Но моя функция всегда возвращает undefined
. Однако, когда я console.info()
значение перед его возвратом, оно отображает правильное значение.
getToken(user_id) {
this.afs.collection("tokens").ref.doc(user_id).get().then((doc) => {
if (doc.exists) {
console.info(doc.data().user_token); //displays the correct user_token value
return doc.data().user_token; //returns undefined!
}
});
}
Разве оба значения не должны быть одинаковыми?
Это может ответить на ваш вопрос: Не удается получить доступ к свойству объекта, даже если оно существует. Возвращает неопределенное
«Вывод console.info(anObject) вводит в заблуждение; состояние отображаемого объекта разрешается только при расширении > в консоли».
Другими словами, doc.data().user_token может быть заполнен асинхронным процессом.
Похоже, вы не возвращаете Promise
из своей функции — в функции getToken
вообще нет инструкции return, поэтому сама функция просто возвращает undefined
. Внутренний оператор возврата, который у вас есть, разрешит обещание, и это хорошо, но вы должны справиться с этим разрешением.
Если вы вернете обещание так:
getToken(user_id) {
return this.afs.collection("tokens").ref.doc(user_id).get().then((doc) => {
if (doc.exists) {
console.info(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
Я пробовал это: getToken(user_id).then(user_token => { let token = user_token.data.user_token; });
но когда я регистрирую токен, он все равно возвращает undefined
Где вы зарегистрировали токен? Если вы сделали это: getToken(user_id).then(user_token => { let token = user_token.data.user_token; console.info(token); });
это должно работать (при условии, что вы изменили getToken
, добавив оператор return). Если вы сделаете это: getToken(user_id).then(user_token => { let token = user_token.data.user_token; }); console.info(token);
вы попытаетесь использовать token
вне области действия функции, и это не сработает.
На самом деле я сделал это: token:any; signInSuccess() { this.tokenService.getToken(user_id).then((user_token) => { this.token = user_token.data().user_token; }); console.info(this.token); }
(Все внутри класса HomePage в файле home.page.ts)
И да, я изменил getToken()
так, как вы предложили
Это все равно не сработает, так как getToken
(и любая функция, включающая промисы) асинхронна. Вы получаете доступ к this.token
после его назначения в коде, но не после разрешения Promise
. Решение Promise
может занять несколько секунд, и, чтобы не останавливать весь ваш код в ожидании завершения запроса, код немедленно продолжается.
Вот пример, который объясняет это лучше, чем я могу jsfiddle.net/6eq7ndxu. Запустите код, откройте консоль браузера и обратите внимание, в каком порядке появляются операторы журнала и с какими полезными нагрузками.
Вы не возвращаете фактическое обещание. Поставьте
return
передthis.afs.collection("tokens")
. Также, пожалуйста, покажите, как вы потребляетеgetToken()
.