Как вырваться из метода цикла querySnapshot forEach? - PullRequest
0 голосов
/ 10 сентября 2018

Я хочу выйти из цикла forEach. Учтите это:

db.collection('users').get().then(querySnapshot => {
        if (!querySnapshot.empty) {
            querySnapshot.forEach(doc => {
                let data = doc.data()
                if (data.age == 16) {
                    break //this is not working
                }
            })
        }
    }
)

В документации ничего не говорится о разрыве цикла forEach

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

.forEach не обеспечивает прямой механизм для ранних выходов. Лучше всего для этого сделать исключение:

querySnapshot => {
  if (!querySnapshot.empty) {

    try {

      querySnapshot.forEach(doc => {
          let data = doc.data()
          if (data.age == 16) {
              // Throw an exception to break. Use a custom exception type to
              // distinguish it from other possible exceptions that could be
              // thrown
              throw EarlyExit; 

          }
      })

    } catch(exception) {

      // If the exception thrown is not our EarlyExit type, then re throw,
      // otherwise resume as if look with terminated
      if(exception !== EarlyExit) {
        throw exception
      }
    }
  }
}

В качестве альтернативы, вы можете использовать обычный подход for-loop для упрощения разбиения:

for(const doc of querySnapshot) {
      let data = doc.data()
      if (data.age == 16) {
          break;
      }
}
0 голосов
/ 10 сентября 2018

Вместо использования forEach непосредственно для QuerySnapshot вы можете использовать итерацию его свойства docs , которое представляет собой простой старый массив javascript.Напишите цикл for, который вы можете break при необходимости:

for (var i in querySnapshot.docs) {
    const doc = querySnapshot.docs[i]
    if (make_some_decision_here) {
        break
    }
}
0 голосов
/ 10 сентября 2018

Согласно здесь https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

Нет способа остановить или прервать цикл forEach (), кроме как с помощью исключения. Если вам нужно такое поведение, метод forEach () является неправильным инструментом.

единственная остановка или разрыв цикла forEach () - это исключение
Попробуйте эти альтернативы
Простая петля
А для ... петли
Array.prototype.every ()
Array.prototype.some ()
Array.prototype.find ()
Array.prototype.findIndex ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...