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}
我的那种茫然和希望得到任何帮助。
我不确定为什么,但对我来说,这个错误是由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;
});
}
我把我的警卫转到承诺来试用。有用!我不知道为什么会这么重要,但我会继续努力。谢谢Victor96! – hartpdx
更改resolve.complete(true);解析.next(true);它应该工作。按照https://angular.io/docs/ts/latest/guide/router.html#!#guards >相应地,路由警卫可以返回Observable
对我来说,'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)
.
所以请出示您的路线.. – mxii
我相信这是与警卫有关的事情,我也试图弄清楚。 – Victor96