2017-03-08 40 views
0

我有一個從API返回一些數據的服務:運行的東西時,HTTP觀察到已訂閱

// ... 

getMetadata() { 
    this.spinner.start(); 
    return this.http.get('/api/metadata').finally(() => this.spinner.stop()); 
} 

// .... 

我想存儲觀察到的在我的部分我在使用的變量返回,以便隨後去:

// ... 
this.metadata$ = this.api.getMetadata(); 
// ... 

而且讓我們說我使用的是使用| async我的模板此觀察的地方,但讓我們說這不會馬上發生。 發生的是,我的微調無論如何都立即顯示出來,即使訂閱完全沒有放置。

所以我的問題是,有沒有辦法定義一個observable,它會在第一次訂閱時調用函數,很像finally運算符,但是當observable第一次(或每次)訂閱至?

提前致謝!

+0

」訂閱根本沒有放在「..你的意思是它出錯或請求不去? –

+0

不,我的意思是沒有人叫它'.subscribe',但還是根本沒有 – Amit

+0

因爲如果我只是「請求」一個可觀察對象而沒有訂閱它,就顯示一個微調對象,對我來說沒有意義,即使沒有訂閱observable也沒有多大意義 – Amit

回答

0
constructor(private _service:YourService) {} 
ngOnInit() { 
    this._service.getMetadata().subscribe(
     (items)=>{ 
     this.metadata$=items,console.log(groups) 
     }, 
     err => console.log(err) 
    ); 
} 
+0

我想要懶惰的數據,不想在沒有被使用的時候檢索它,這就是爲什麼我使用'async'管道的原因 – Amit

0

你可以嘗試:

getMetadata() { 

    return Observable.of(this.spinner.start()). 
      flatMap(()=> this.http.get('/api/metadata')). 
      finally(() => this.spinner.stop()); 
} 

啓動可觀察到與微調,然後用flatMap發出請求並最終關閉微調。 「

+0

你在第一行創建的觀察值將是'this'的返回值。 spinner.start()',當observable獲得訂閱時它不會調用它,但只返回它的返回值(在我的情況下這是未定義的) – Amit

+0

它將返回請求值。第一個observable轉到flatmap..or使用concatMap –

+0

不,我的意思是,當'getMetadata'函數被調用時,'this.spinner.start()'會立即被調用,這不是我想要實現的。 – Amit