Quiero salir de un bucle forEach. Considera esto:

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

La documentación no menciona nada acerca de romper el bucle forEach

4
TSR 10 sep. 2018 a las 05:08

3 respuestas

La mejor respuesta

En lugar de utilizar forEach en QuerySnapshot directamente, puede repetir su docs en su lugar, que es simplemente un viejo javascript array. Escriba un bucle for, que puede break según sea necesario:

for (var i in querySnapshot.docs) {
    const doc = querySnapshot.docs[i]
    if (make_some_decision_here) {
        break
    }
}
11
Doug Stevenson 10 sep. 2018 a las 03:04

Según aquí https: //developer.mozilla .org / es-ES / docs / Web / JavaScript / Reference / Global_Objects / Array / forEach

No hay forma de detener o romper un bucle forEach () que no sea lanzando una excepción. Si necesita ese comportamiento, el método forEach () es la herramienta incorrecta.

La única parada o interrupción de un bucle forEach () es lanzar una excepción
Prueba estas alternativas
Un bucle simple
A para ... de bucle
Array.prototype.every ()
Array.prototype.some ()
Array.prototype.find ()
Array.prototype.findIndex ()

0
Chris Li 10 sep. 2018 a las 02:16

.forEach no proporciona un mecanismo directo para salidas tempranas. Su mejor apuesta para lograr esto sería lanzar una excepción:

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

Alternativamente, podría usar el enfoque regular de bucle for para permitir una apariencia más simple:

for(const doc of querySnapshot) {
      let data = doc.data()
      if (data.age == 16) {
          break;
      }
}
0
Dacre Denny 10 sep. 2018 a las 02:16