Saltar al contenido

EmptyError: no hay elementos en secuencia

Poseemos la mejor solución que descubrimos en internet. Nosotros esperamos que te sea útil y si deseas comentarnos cualquier detalle que nos pueda ayudar a crecer hazlo con libertad.

Solución:

Este error ocurre cuando se usa RxJS 5.5.3 con angular (versión 4/5), así que omita RxJS 5.5.3 y use RxJS 5.5.4 agregando "rxjs": "^5.5.4" a su paquete de proyecto.json.


Antes de que saliera RxJS 5.5.4 respuesta: (antiguo, no hagas esto)

  • Bloquee la versión 5.5.2 RxJS en la fuente package.json
  • agregue pathMatch: ‘completo’ en la fuente de rutas vacías

Parece que se trata de un problema de RxJS que debería solucionarse muy pronto. fuente

En mi caso, tengo esos errores cuando usé first() en un Observable que tenía un takeUntil() emitido antes first().

Ejemplo:

let test$ = new ReplaySubject(1);
let testAux$ = new ReplaySubject(1);
let test2$ = test$.asObservable().takeUntil(testAux$.asObservable());
test2$.first().subscribe(() => console.log('first!'));
testAux$.next(null);

Fue difícil descubrir el problema porque devolví un observable con takeUntil() en un servicio que fue utilizado por una clase diferente (en un archivo diferente) que llamó first()y el error se recibió durante la navegación de la página (porque takeUntil() recibió un observable que se emitía cuando se destruía la página anterior), y aparecía como que el problema estaba en la propia navegación.

Lo más raro es que el error ocurre cuando el next() se llama, y ​​no en el segundo argumento de subscribe(), lo que hace que el proceso de navegación falle. No sé si el equipo de rxjs eligió esta característica para comportarse de esta manera, porque hace que sea mucho más difícil aislar el problema y, el problema principal, el productor recibe un error debido a algo hecho por un consumidorlo que me parece un mal diseño.

Según este comentario:

.first() emitirá exactamente un elemento o arrojará un error[…] Si desea obtener como máximo un elemento del observable, use .take(1).

Actualización (2020-08-31)

Parece que el error en realidad se puede manejar al incluir un segundo argumento para recibir errores en la suscripción, como en el siguiente caso:

const test$ = new ReplaySubject(1);
const testAux$ = new ReplaySubject(1);
const test2$ = test$.asObservable().takeUntil(testAux$.asObservable());
test2$.first().subscribe(() => console.log('first!'), () => console.log('first error'));
testAux$.subscribe(() => console.log('another'), () => console.log('another error'));
console.log('1');
testAux$.next(null);
console.log('2');

Eso registra:

1
first error
another
2

(en este caso no vería el No elements in sequence error)

Pero si desea recibir como máximo 1 artículo (pero aún así estaría bien no recibir ninguno), entonces take(1) seguiría siendo el mejor enfoque, y es lo que recomendaría por defecto, en lugar de first().

Necesitas cambiar a:

canActivate(route: ActivatedRouteSnapshot): Observable
   return new Observable(resolve => 
      resolve.next(true);
      resolve.complete();
  );

================

No estoy seguro de por qué, pero para mí, este error fue causado por los protectores del enrutador CanActivate que usan observables. Sin embargo, pasar a las promesas solucionó el problema.

Me mudé de esto:

canActivate(route: ActivatedRouteSnapshot): Observable
     return new Observable(resolve => 

          resolve.complete(true);
        //or
          resolve.complete(false);

    );

a esto:

canActivate(route: ActivatedRouteSnapshot)
     return true;
        //or
          return false;

    );
}

Recuerda algo, que tienes la capacidad de comentar si te fue de ayuda.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *