EmptyError: нет элементов в последовательности
Я обновляю свое приложение Angular2 с 2.0.0 до 2.3.0, и у меня возникает следующая ошибка. Есть идеи о том, почему? Я видел это другое сообщение (Angular 2.0.1 Router EmptyError: без элементов в последовательности), но после этого проблема все еще остается. Что вызывает эту ошибку?
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
Я также заметил, что объект NavigationError бросается, когда я пытаюсь перейти на маршрут, использующий гвардии. Но только ошибка выше - это то, что показано на консоли.
NavigationError {id: 2, url: "/home", error: EmptyError}
Я немного растерялся и буду признателен за любую помощь.
Ответы
Ответ 1
Эта ошибка возникает при использовании RxJS 5.5.3 с angular (версия 4/5), поэтому просто пропустите RxJS 5.5.3 и используйте RxJS 5.5.4, добавив "rxjs": "^5.5.4"
в ваш проект package.json.
До выхода RxJS 5.5.4 ответ: (старый, не делайте этого)
- Блокировка версии 5.5.2 RxJS на package.json источник
- добавить pathMatch: "полный" на пустых путях источник
Похоже, что это проблема с RxJS, которая должна быть исправлена довольно скоро. источник
Ответ 2
В моем случае у меня есть эти ошибки, когда я использовал first()
в Observable
, у которого был takeUntil()
, выпущенный до first()
.
Пример:
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);
Трудно было обнаружить проблему, потому что я вернул Observable
с takeUntil()
в службу, которая использовалась другим классом (в другом файле), который вызывал first()
, и ошибка была получена во время страницы (потому что takeUntil()
получил Observable
, который был удален, когда предыдущая страница была уничтожена), и оказалось, что проблема была в самой навигации.
Самое странное, что ошибка возникает, когда вызывается next()
, а не во втором аргументе subscribe()
, что приводит к сбою самого процесса навигации. Я не знаю, была ли эта функция выбрана командой rxjs для того, чтобы вести себя таким образом, потому что гораздо сложнее изолировать проблему.
Согласно этот комментарий:
Сначала выдается только один элемент или выкидывает ошибку [...] Если вы хотите получить не более одного элемента из наблюдаемого, используйте .take(1)
.
Ответ 3
Вам нужно изменить на:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.next(true);
resolve.complete();
});
}
================
Я не уверен, почему, но для меня эта ошибка была вызвана защитниками маршрутизатора CanActivate, использующими наблюдаемые. Однако переход к обещаниям устранил проблему.
Я перешел от этого:
canActivate(route: ActivatedRouteSnapshot): Observable<boolean>{
return new Observable<boolean>(resolve => {
resolve.complete(true);
//or
resolve.complete(false);
});
}
к этому:
canActivate(route: ActivatedRouteSnapshot){
return true;
//or
return false;
});
}
Ответ 4
Добавьте это свойство на свой маршрут.
pathMatch: 'full
например,
{ pathMatch: 'full', path: "", component: HomeComponent }
Это сработало для меня.
Ответ 5
У меня была такая же проблема, потому что я делал .first() после this.http.get(); Http.get возвращает наблюдаемую холодную информацию, поэтому сначала она не нужна, поскольку холодная наблюдаемая отписывается.
. This.http.get() трубы (первый()); → EmptyError: нет элементов в последовательности
Ответ 6
У меня была эта проблема в Angular 6/RxJs 6, и я обнаружил, что это произошло из-за того, что у моего охранника был редирект и сразу после него.
До:
if (!res) {
this.router.navigate(['/']);
observer.complete(); // <-- This was the offender
}
После:
if (!res) {
this.router.navigate(['/']);
}
Ответ 7
В моем случае, используя версию 5.5.12 rxjs, у меня были проблемы с этим в сценарии CanActivate. Но решение для меня было очень простым в конце. Я изменил свой код с
const guard: Subject<boolean> = new Subject<boolean>();
в
const guard: ReplaySubject<boolean> = new ReplaySubject<boolean>(1);
призвание
guard.next(...);
guard.complete();
потом. Это добилось цели. Так что в моем сценарии не нужно ни первых, ни обещаний.
Ответ 8
Для любого, кто пришел сюда из-за сообщения об ошибке, это происходило с нами, потому что мы возвращали пустую Наблюдаемую. Вам необходимо вернуть в аренду какое-то значение, например "true".
return of(true);
Ответ 9
Ничто из вышеперечисленного не сработало. Это то, что сработало для меня. В определении маршрута:
{ path: '', component: WelcomeComponent, pathMatch: 'full' },