2016-02-29 43 views
15

我想問你一些幫助。我省略了我認爲不重要的代碼。讓我們想象一下TS文件,其中包含服務電話:Angular2 Observable.fork加入可觀察變量 - ReferenceError:Observable未定義

//文件:someService.ts

@Injectable() 
export class SomeService { 
    method1(){ 
     var observable = this.http.get(someUrl) 
          .map((res: Response) =><MyClass[]>res.json()); 
     return observable; 
    } 

    method2(){ 
     // Similar to method1 
    } 
} 

//文件:someComponent.ts

請注意,this.method1observable和method2observable正確分配從父(根)組件和他們的類型是可觀察。

import {Observable}  from 'rxjs/Observable'; 

export class SomeClass { 
    public m1: Observable<MyClass[]>; 
    public m2: Observable<AnotherClass[]> 

    ngOnInit() { 
     Observable.forkJoin(this.m1,this.m2) //<- ERROR HERE 
     .subscribe(data => { 
      this.myFunction(data[0], data[1]); 
      requestAnimationFrame(this.renderLoop); 
     }); 
    } 
} 

我得到「未捕獲的ReferenceError:可觀察沒有定義」。 難道你不知道我做錯了什麼嗎?我看到了一些Observable.forkJoin在服務中被調用的例子。但是如果我想在組件內調用它呢?

+0

你可以嘗試改變'從 'rxjs /可觀察' 進口{}可觀察到;對''進口 'rxjs /接收';'? –

+2

您是否導入了rxjs/add/observable/forkJoin''或'import'rxjs/Rx''? – Sasxa

+0

@GünterZöchbauer:沒有幫助,仍然是同一問題 – Tomino

回答

29

你可以嘗試導入這樣:

import {Observable} from 'rxjs/Rx'; 

代替:

import {Observable} from 'rxjs/Observable'; 

你也應該使用數組提供您可觀察到forkJoin方法:

ngOnInit() { 
     Observable.forkJoin([this.m1,this.m2]) 
     .subscribe(data => { 
      this.myFunction(data[0], data[1]); 
      requestAnimationFrame(this.renderLoop); 
     }); 
    } 

並且不要忘記在@Component中指定輸入:

@Component({ 
    inputs: ['m1', 'm2'] 
}) 
+0

是的,但它是另一個錯誤;-)你確定你提供給forkJoin的observable不是null嗎? –

+0

SomeClass是一個組件嗎?在哪裏/如何設置可觀察的屬性? –

+0

是的,我確定:-)我可以對每個可觀察對象執行'.subscribe'並查看結果。另外谷歌控制檯告訴我,他們不是null。 – Tomino

2

你可以參考這個鏈接瞭解更多關於使用forkjoin()方法運行多個併發http.get()請求的信息。在這裏你可以得到一個完整的工作示例。

http://www.metaltoad.com/blog/angular-2-http-observables

+0

如果你使用它的例子,你會得到更多的分數,而不僅僅是鏈接,這是一個很好的鏈接,謝謝:) – Roberto

5

應該避免導入整個rxjs庫,因爲它是相當大的。如果你有以下進口在您的應用程序的任何地方,您將導入整個rxjs,所以有這一點:

import {Observable} from 'rxjs'; 

import {Observable} from 'rxjs/Rx'; 

可以代替進口個人特點,你將使用,例如:

import {Observable} from 'rxjs/Observable'; 
import 'rxjs/add/operator/map'; 
import 'rxjs/add/observable/forkJoin'; 

UPDATE:與rxjs 5.5開始,the recommended way to import operators is

import { range } from 'rxjs/observable/range'; 
import { map, filter, scan } from 'rxjs/operators'; 

const source$ = range(0, 10); 

source$.pipe(
    filter(x => x % 2 === 0), 
    map(x => x + x), 
    scan((acc, x) => acc + x, 0) 
) 
.subscribe(x => console.log(x)) 
+0

我已經設置它像你有三行,但仍然出現錯誤「forkJoin不存在Observable類型」我正在使用webpack – powerfade917

+0

你能提供完整的錯誤? –

+0

這只是打字稿在visual studio中拋出錯誤「forkJoin在Observable類型上不存在」,就像這樣。 – powerfade917