Estoy un poco confundido acerca de a qué métodos pertenecen y cuándo usarlos.

En este momento, estoy usando subscribe básicamente para todo y no me funciona cuando quiero un valor estático rápido de Firebase. ¿Puede explicar cuándo debería usar subscribe frente a otros métodos que no sean estrictamente observables?

1
Bk Razor 14 dic. 2016 a las 23:59

2 respuestas

La mejor respuesta

Al trabajar con valores asíncronos, tiene algunas opciones: promises, rxjs, callbacks. Cada opción tiene sus propios inconvenientes.

Cuando desea recuperar un solo valor asincrónico, es tentador usar promesas por su simplicidad (.then(myVal => {})). Pero esto no le da acceso a cosas como tiempos de espera / aceleración / comportamiento de reintento, etc. Los flujos de Rx, incluso para valores únicos, le brindan estas opciones.

Entonces, mi recomendación sería, incluso si desea tener un valor único, usar Observables. No hay una opción asíncrona para 'un valor estático rápido de una base de datos remota'.

Si no desea utilizar el método .subscribe(), existen otras opciones que le permiten activar su suscripción, como .toPromise(), que podría ser más fácil para recuperar un valor único mediante Rx.

const getMyObjPromise = $firebase.get(myObjId)
  .timeout(5000)
  .retry(3)
  .toPromise()

getMyObjPromise.then(obj => console.log('got my object'));
2
Mark van Straten 15 dic. 2016 a las 07:51

Supongo que tienes un método de suscripción que contiene un montón de lógica como si fuera un ". Then" y guardas el resultado en alguna variable local.

Primero: intente evitar cualquier lógica dentro del método de suscripción -> use operadores de flujo antes de eso y luego suscríbase solo para recuperar los datos. Es mucho más flexible con eso y es mucho más fácil probar unitariamente esas partes individuales de su flujo que probar un componente completo en sí mismo.

Segundo: trate de evitar el uso de suscripciones manuales en absoluto; en los controladores angulares, son propensos a causar pérdidas de memoria si no se cancela la suscripción. En su lugar, use async-pipe en su plantilla y deje que angular administre la suscripción.

1
olsn 15 dic. 2016 a las 07:53