#javascript #firebase #google-cloud-firestore
# #javascript #firebase #google-облако-firestore
Вопрос:
Я пытаюсь вернуть правильное количество сообщений (длина listMessage
) из функции ниже. Я могу получить правильные объекты сообщения listMessage
, но его длина всегда равна нулю.
checkLastMsg = () =>
{
var groupChatId = null;
var listMessage = [];
// console.log(this.peerUserId);
if (this.hashString(this.currentUserId) <= this.peerUserId)
{
groupChatId = `${this.currentUserId}-${this.peerUserId}`;
}
else
{
groupChatId = `${this.peerUserId}-${this.currentUserId}`;
}
// console.log(groupChatId);
myFirestore
.collection(AppString.NODE_MESSAGES)
.doc(groupChatId)
.collection(groupChatId)
.onSnapshot(
snapshot =>
{
snapshot.docChanges().forEach(change =>
{
if (change.type === AppString.DOC_ADDED)
{
listMessage.push(change.doc.data())
}
})
},
err =>
{
this.props.showToast(0, err.toString())
})
// console.log(listMessage.length);
console.log(listMessage.length);
}
Может ли кто-нибудь проверить, что здесь что-то не так, и как я могу исправить эту проблему?
Комментарии:
1. Код firestore является асинхронным. Асинхронный код задерживается до тех пор, пока весь синхронный код (например, ваш console.log) не завершит выполнение. Вам придется использовать синтаксис promise или
async/await
получить значение firestore. Прочитайте об этом, а также о синхронном и асинхронном коде в Javascript, это часто встречается. Лучше всего иметь хорошее представление об этом
Ответ №1:
Как все говорили, код асинхронный, следовательно, вы можете заставить работать так:
checkLastMsg = async () =>
{
var groupChatId = null;
var listMessage = [];
// console.log(this.peerUserId);
if (this.hashString(this.currentUserId) <= this.peerUserId)
{
groupChatId = `${this.currentUserId}-${this.peerUserId}`;
}
else
{
groupChatId = `${this.peerUserId}-${this.currentUserId}`;
}
// console.log(groupChatId);
await myFirestore
.collection(AppString.NODE_MESSAGES)
.doc(groupChatId)
.collection(groupChatId)
.onSnapshot(
snapshot =>
{
snapshot.docChanges().forEach(change => {
if (change.type === AppString.DOC_ADDED) {
listMessage.push(change.doc.data())
}
})
},
err => {
this.props.showToast(0, err.toString())
}
)
// console.log(listMessage.length);
console.log(listMessage.length);
}```
Комментарии:
1. Я только что попытался исправить свой код с
async/await
помощью, но длина по-прежнему возвращает ноль.2. тогда проблема может быть либо в том, что groupChatId недействителен, либо в том, что оператор if не передается
if (change.type === AppString.DOC_ADDED)
. Проверьте оба.3. оба условия верны, потому что я могу проверить правильные все объекты с правильными значениями внутри
listMessage
, но длина равна нулю независимо.
Ответ №2:
Код Firebase выполняется асинхронно. Попробуйте, возможно, зарегистрировать список в функции обратного вызова или что-то в этом роде