I'm upgrading my Angular2 app from 2.0.0 to 2.3.0, and I'm running into the following error. Any ideas as to why? I saw this other post (Angular 2.0.1 Router EmptyError: no elements in sequence), but after trying this, the issue still remains. What causes this error?
Error: Uncaught (in promise): EmptyError: no elements in sequence
Error: no elements in sequence
at EmptyError.ZoneAwareError (zone.js:672)
at new EmptyError (EmptyError.ts:13)
at FirstSubscriber._complete (first.ts:161)
at FirstSubscriber.Subscriber.complete (Subscriber.ts:122)
at Subject._subscribe (Subject.ts:109)
at Subject.Observable.subscribe (Observable.ts:98)
at Observable._subscribe (Observable.ts:158)
at Observable.subscribe (Observable.ts:98)
at Observable._subscribe (Observable.ts:158)
at FirstOperator.call (first.ts:82)
at Observable.subscribe (Observable.ts:96)
at Object.subscribeToResult (subscribeToResult.ts:32)
at MergeAllSubscriber._next (mergeAll.ts:82)
at MergeAllSubscriber.Subscriber.next (Subscriber.ts:95)
at MapSubscriber._next (map.ts:80)
at resolvePromise (zone.js:475) [angular]
at resolvePromise (zone.js:460) [angular]
at /libs/zone.js/dist/zone.js:509:17 [angular]
at Object.onInvokeTask (core.umd.min.js:32) [angular]
at ZoneDelegate.invokeTask (zone.js:261) [angular]
at Zone.runTask (zone.js:151) [<root> => angular]
at drainMicroTaskQueue (zone.js:405) [<root>]
at ZoneTask.invoke (zone.js:336) [<root>]ErrorHandler.handleError @ core.umd.min.js:31next @ core.umd.min.js:32generatorOrNext.object.schedulerFn @ core.umd.min.js:32SafeSubscriber.__tryOrUnsub @ Subscriber.ts:238SafeSubscriber.next @ Subscriber.ts:190Subscriber._next @ Subscriber.ts:135Subscriber.next @ Subscriber.ts:95Subject.next @ Subject.ts:61EventEmitter.emit @ core.umd.min.js:32NgZone.triggerError @ core.umd.min.js:32onHandleError @ core.umd.min.js:32ZoneDelegate.handleError @ zone.js:233Zone.runGuarded @ zone.js:129_loop_1 @ zone.js:416drainMicroTaskQueue @ zone.js:425ZoneTask.invoke @ zone.js:336
I've also noticed that a NavigationError object is thrown when I try to change to a route that uses Guards. But only the error above is what is shown in the console.
NavigationError {id: 2, url: "/home", error: EmptyError}
I'm kind of at a loss and would appreciate any help.
This error happens when using RxJS 5.5.3 with angular (version 4/5), so just skip RxJS 5.5.3, and use RxJS 5.5.4 by adding "rxjs": "^5.5.4" to your project package.json.
Before RxJS 5.5.4 came out answer: (old, don't do this)
It looks like this is an RxJS issue which should be patched pretty soon. source
In my case I've got those errors when I used first() in an Observable that had a takeUntil() emitted before first().
Example:
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);
It was hard to discover the problem because I returned an observable with takeUntil() in a service that was used by a different class (in a different file) that called first(), and the error was received during page navigation (because takeUntil() received an observable that emitted when the previous page was destroyed), and it appeared as the problem was in the navigation itself.
The weirdest thing is that the error happens when the next() is called, and not in the 2nd argument of subscribe(), causing the navigation process itself to fail. I don't know if this feature was chosen by the rxjs team to behave this way, because it makes much more difficult to isolate the problem.
According to this comment:
First will emit exactly one item or throw an error[...] If you would like to get at most one item from the observable, use
.take(1).
You need change to:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.next(true);
resolve.complete();
});
}
================
I am unsure why but for me this error was caused by CanActivate router guards using observables. Moving to promises fixed the issue however.
I moved from this:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.complete(true);
//or
resolve.complete(false);
});
}
to this:
canActivate(route: ActivatedRouteSnapshot){
return true;
//or
return false;
});
}
Add this property to your route.
pathMatch: 'full
for eg.
{ pathMatch: 'full', path: "", component: HomeComponent }
It worked for me.
Had the same issue because I was doing a .first() after a this.http.get(); Http.get returns a cold observable so first was not needed because cold observables unsubscribe themselves.
this.http.get().pipe(first()); -> EmptyError: no elements in sequence
I had this issue in Angular 6 / RxJs 6 and found it was due to my guard having a redirect and complete right after it.
Before:
if (!res) {
this.router.navigate(['/']);
observer.complete(); // <-- This was the offender
}
After:
if (!res) {
this.router.navigate(['/']);
}
In my case, using version 5.5.12 of rxjs, I had trouble with this in a CanActivate scenario. But the solution for me was very easy in the end. I changed my code from
const guard: Subject<boolean> = new Subject<boolean>();
to
const guard: ReplaySubject<boolean> = new ReplaySubject<boolean>(1);
Calling
guard.next(...);
guard.complete();
later. That did the trick. So no .first nor promises needed in my scenario.
For anyone coming here because of the error message, this was happening to us because we were returning a void Observable. You need to return at lease some value like "true".
return of(true);
None of the above worked for it. This is what worked for me. In the route definition:
{ path: '', component: WelcomeComponent, pathMatch: 'full' },
来源:https://stackoverflow.com/questions/41131476/emptyerror-no-elements-in-sequence