Длина массива равна нулю

#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 выполняется асинхронно. Попробуйте, возможно, зарегистрировать список в функции обратного вызова или что-то в этом роде