2016-12-13 56 views
20

我將我的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

回答

71

使用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

10

我不確定爲什麼,但對我來說,這個錯誤是由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

5

在我來說,當我在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) .

7

將此屬性添加到您的路由。

pathMatch: 'full 

例如,

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

它爲我工作。

+0

這也適用於我 – MFB

+1

有沒有必要改變應用程序路線,以解決這個問題(截至今天)。一個新版本的RxJS出現了這個錯誤的修復。將RxJS升級到版本5.5.4。 – golfadas