我将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}
我有点不知所措并希望得到任何帮助。
答案 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出现之前回答:(老,不要这样做)
看起来这是一个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);