Подтвердить что ты не робот

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}

Я немного растерялся и буду признателен за любую помощь.

4b9b3361

Ответ 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' },