EmptyError:顺序没有元素

时间:2016-12-13 22:14:29

标签: angular angular2-routing

我将Angular2应用从2.0.0升级到2.3.0,并且我遇到了以下错误。任何想法为什么?我看到了另一篇文章(Angular 2.0.1 Router EmptyError: no elements in sequence),但在尝试之后,问题仍然存在。是什么导致了这个错误?

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

我还注意到当我尝试更改为使用Guards的路由时会抛出NavigationError对象。但只有上面的错误是控制台中显示的内容。

NavigationError {id: 2, url: "/home", error: EmptyError}

我有点不知所措并希望得到任何帮助。

10 个答案:

答案 0 :(得分:76)

当使用带角度的RxJS 5.5.3(版本4/5)时会发生此错误,因此只需跳过RxJS 5.5.3,并通过将"rxjs": "^5.5.4"添加到项目package.json中来使用RxJS 5.5.4。 / p>

在RxJS 5.5.4出现之前回答:(老,不要这样做)

  • 在package.json source
  • 上锁定版本5.5.2 RxJS
  • 添加pathMatch:&#39;完整&#39;在空路source

看起来这是一个RxJS issue,应该很快修补。 source

答案 1 :(得分:18)

就我而言,当我在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团队是否选择了这个功能来表现这种方式,因为它使得孤立问题变得更加困难。

根据this comment

  

首先会发出一个项目或抛出错误[...]如果您想从observable中获取最多一个项目,请使用.take(1)

答案 2 :(得分:15)

您需要更改为:

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

=====

我不确定为什么但是对我来说这个错误是由使用observables的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;

    });
}

答案 3 :(得分:7)

将此属性添加到您的路线中。

pathMatch: 'full

例如。

{ pathMatch: 'full', path: "", component: HomeComponent }

它对我有用。

答案 4 :(得分:4)

有同样的问题,因为我在this.http.get();之后执行.first(); Http.get返回一个冷的可观察对象,因此不需要第一个,因为冷的可观察对象会自行取消订阅。

this.http.get()。pipe(first()); -> EmptyError:顺序没有元素

答案 5 :(得分:2)

在使用last()运算符时,我还将分享有关 RxJS 6.5.3 中此错误的经验。 可以通过应用默认值来解决该问题,例如:

.pipe(
  last(null, []) // predicate = null, defaultValue = []
)

答案 6 :(得分:1)

我在Angular 6 / RxJs 6中遇到过这个问题,发现这是因为我的后卫有一个重定向并且在它之后完成。

在:

if (!res) {
  this.router.navigate(['/']);
  observer.complete(); // <-- This was the offender
}

后:

if (!res) {
  this.router.navigate(['/']);
}

答案 7 :(得分:1)

在我的情况下,使用rxjs 5.5.12版,在CanActivate场景中遇到了麻烦。但最终,对我来说解决方案非常容易。我从更改了代码

const guard: Subject<boolean> = new Subject<boolean>();

const guard: ReplaySubject<boolean> = new ReplaySubject<boolean>(1);

致电

guard.next(...);
guard.complete();

后来。做到了。因此,在我的情况下,不需要.first或promises。

答案 8 :(得分:0)

以上都不是。这对我有用。在路由定义中:

{ path: '', component: WelcomeComponent, pathMatch: 'full' },

答案 9 :(得分:0)

对于由于错误消息而来到这里的任何人,这是发生在我们身上的,因为我们返回的是一个无效的Observable。您需要租借返回一些值,例如“ true”。

return of(true);