EmptyError:没有顺序的元素

EmptyError:没有顺序的元素

问题描述:

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

我的那种茫然和希望得到任何帮助。

+0

所以请出示您的路线.. – mxii

+0

我相信这是与警卫有关的事情,我也试图弄清楚。 – Victor96

使用RxJS 5.5.3时具有角(4/5版本),所以只跳过RxJS 5.5.3,并通过加入"rxjs": "^5.5.4"使用RxJS 5.5.4该错误发生到你的项目package.json。


RxJS 5.5.4之前就出来了答案:(旧的,不这样做)

  • 锁版本5.5.2 RxJS软件包。JSON source
  • 加pathMatch:“全”的空路径source

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

+3

可以确认,刚刚升级到RxJS 5.5.3,我们遇到同样的问题。 –

+1

确认,谢谢! – ShinDarth

+1

与角4.4.6相同,谢谢! – acidghost

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

我从这个感动:

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; 

    }); 
} 
+0

我把我的警卫转到承诺来试用。有用!我不知道为什么会这么重要,但我会继续努力。谢谢Victor96! – hartpdx

+1

更改resolve.complete(true);解析.next(true);它应该工作。按照https://angular.io/docs/ts/latest/guide/router.html#!#guards >相应地,路由警卫可以返回Observable 或Promise ,并且路由器将等待可观察到的解决为真或假。 完成不会返回任何元素,但接下来会做。 – skin

+0

对我来说,'resolve.next(true); resolve.complete()'不起作用,但使用'Promise'。 – Lars

在我来说,当我在Observable是有takeUntil()first()之前发出使用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); 

这是很难发现的问题,因为我有takeUntil()在过去曾通过不同的类(在不同的文件中)被称为first()服务返回的observable,和错误是在页面导航期间收到的(因为takeUntil()收到了上一页被销毁时发出的observable),并且问题出现在导航本身中。

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

根据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) .

将此属性添加到您的路由。

pathMatch: 'full 

例如,

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

它为我工作。

+0

这也适用于我 – MFB

+1

有没有必要改变应用程序路线,以解决这个问题(截至今天)。一个新版本的RxJS出现了这个错误的修复。将RxJS升级到版本5.5.4。 – golfadas