EmptyError:顺序没有元素

har*_*pdx 34 angular2-routing angular

我正在将我的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
Run Code Online (Sandbox Code Playgroud)

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

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

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

gol*_*das 76

使用RxJS 5.5.3 with angular(版本4/5)时会发生此错误,因此只需跳过RxJS 5.5.3,并通过添加"rxjs": "^5.5.4"到项目package.json中使用RxJS 5.5.4 .


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

  • 在package.json 上锁定版本5.5.2 RxJS
  • 在空路径上添加pathMatch:'full'

看起来这是一个RxJS问题,应该很快修补.资源

  • 可以确认,刚刚升级到RxJS 5.5.3并且我们遇到了同样的问题. (3认同)
  • rxjs 6.5.2 和 Angular 8 存在此问题。我的空路线已经有 pathMatch: 'full' 。 (2认同)

Luc*_*tto 31

在我来说,当我用我有这些错误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);
Run Code Online (Sandbox Code Playgroud)

这是很难发现的问题,因为我返回一个observabletakeUntil()该叫过去曾通过不同的类(在不同的文件)服务first(),和页面导航过程中接收到错误(因为takeUntil()收到observable该发射时在上一个页面这个问题出现在导航本身.

最奇怪的是,在next()调用时发生错误,而不是在第二个参数中subscribe(),导致导航过程本身失败.我不知道rxjs团队是否选择了这个功能来表现这种方式,因为它使得隔离问题变得更加困难.

根据这个评论:

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

  • 按照此处的建议将第一个()更改为take(1)修复了类似的错误消息"错误:序列中没有元素". (6认同)
  • 在我的情况下,一个组件正在一个空的Observable上调用`.first()`(该Observable由服务的模拟实现返回,因此它仅在单元测试中失败)。 (2认同)

Vic*_*r96 17

您需要更改为:

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

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

我不确定为什么但是对我来说这个错误是由使用observables的CanActivate路由器防护引起的.然而,转向承诺解决了这个问题.

我离开了这个:

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

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

    });
}
Run Code Online (Sandbox Code Playgroud)

对此:

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

    });
}
Run Code Online (Sandbox Code Playgroud)

  • 改变resolve.complete(true); to resolve.next(true); 它应该工作.根据https://angular.io/docs/ts/latest/guide/router.html#!#guards>相应地,路由保护可以返回Observable <boolean>或Promise <boolean>,路由器将等待可观察的解决方法是真还是假.并且完成不会返回任何元素,但接下来会. (2认同)

Kri*_*lye 7

将此属性添加到您的路线.

pathMatch: 'full
Run Code Online (Sandbox Code Playgroud)

例如.

{ pathMatch: 'full', path: "", component: HomeComponent }
Run Code Online (Sandbox Code Playgroud)

它对我有用.


The*_*ult 7

有同样的问题,因为我在 this.http.get(); 之后做了一个 .first(); Http.get 返回一个冷的 observable,所以 first 不需要,因为冷的 observables 自己取消订阅。

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

  • 你是这个的节省者,紧迫的期限,不会想到这一点。 (2认同)

des*_*ien 6

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

return of(true);
Run Code Online (Sandbox Code Playgroud)


sci*_*per 6

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

.pipe(
  last(null, []) // predicate = null, defaultValue = []
)
Run Code Online (Sandbox Code Playgroud)