Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

254
Visualizações
¿Se puede simplificar esta lógica de combinación de rxjs?

Tengo un observable (onAuthStateChanged) del cliente de Firebase que:

  1. emite un null inmediatamente si el usuario no ha iniciado sesión, y
  2. emite null y luego un user object unos momentos más tarde si el usuario ha iniciado sesión.
 const observable = new Observable((obs) => { return app.auth().onAuthStateChanged( obs.next, obs.error, obs.complete ) })

Lo que quiero es:

  1. ignore cualquier valor null emitido durante los primeros 1000 ms del ciclo de vida de la aplicación (se acepta el valor null que viene después de 1000 ms)
  2. siempre emite user object independientemente de la hora a la que llegue
  3. si no aparece ningún user object en los primeros 1000 ms, emita un null en la marca de 1000 ms

Esto es lo que he hecho (y parece funcionar). Sin embargo, soy reacio a usar este código ya que no parece tan conciso:

 const o1 = observable.pipe(skipUntil(timer(1000))) const o2 = observable.pipe( takeUntil(o1), filter((user) => user !== null) ) const o3 = timer(1000).pipe(takeUntil(o2), mapTo(null)) merge(o1, o2, o3).subscribe({ next: setUser, error: console.log, complete: () => console.log("error: obs completed, this shouldn't happen"), })

¿Hay alguna manera de hacer esto sin fusionar? Intenté revisar los documentos pero estoy bastante perdido.

¡Gracias por tu ayuda!

about 4 years ago · Juan Pablo Isaza
2 Respostas
Responde à pergunta

0

Podrías usar concat en lugar de fusionar. Piense en ello como si usara la primera fuente hasta que se complete, luego use la segunda fuente.

 const nonNullUser = firebaseUser.pipe( filter(user => user !== null), takeUntil(timer(1000)) ); const user = concat(nonNullUser, firebaseUser); user.subscribe(...);

Me acabo de dar cuenta de que esta solución no realizará explícitamente el paso n. ° 3 " emitir nulo en la marca de 1000 ms ". Estaba pensando que suscribirme a firebaseUser emitiría el valor más reciente. Pero, no estoy seguro si eso es cierto para su escenario.

Si no, podríamos lograrlo fácilmente agregando shareReplay de esta manera:

 const firebaseUser = observable.pipe(shareReplay(1));
about 4 years ago · Juan Pablo Isaza Relatório

0

Si bien me gustó la respuesta de @BizzyBob, estaba realmente intrigado por estos requisitos y quería ver qué otras opciones estaban disponibles. Esto es lo que produje:

 const auth$ = observable.pipe( startWith(null) ) const null$ = timer(1000).pipe( switchMap(_=>auth$) ) const valid$ = auth$.pipe( filter(user=>!!user) ) const user$ = race(null$, valid$);

Tenemos nuestra fuente auth$ observable que obtiene sus datos de Firebase. Sin embargo, startWith() emitirá inmediatamente un valor null antes de cualquier valor proveniente de Firebase.

Declaré dos observables para casos nulos y no nulos, null$ y valid$ .

El observable null$ se suscribirá a auth$ después de 1000 ms. Cuando esto sucede, inmediatamente emite un null gracias al operador startWith() .

El observable valid$ se suscribe a auth$ inmediatamente pero solo emite datos de usuario válidos gracias a filter() . No emitirá startWith(null) porque el filtro lo atrapa.

Por último, declaramos user$ usando el operador race() . Este operador acepta una lista de observables como sus parámetros. El primer observable en emitir un valor gana y es la suscripción resultante.

Entonces, en nuestra carrera, valid$ tiene 1000 ms para emitir un usuario válido. Si no es así, race() se suscribirá a null$ , lo que dará como resultado el null inmediato y todos los valores futuros provenientes de Firebase.

about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda