2017-04-17 86 views
0

例如,在我創造新的觀測量時使用以下模板很多:編寫新的Observables時有沒有辦法將observer.next和observer.complete結合起來?

myFunction(): Observable<any> { 
    return new Observable((observer) => { 
    // do things, like make HTTP calls, cache, etc. 
    // generate valueToReturn 
    observer.next(valueToReturn); 
    observer.complete(); 
    }); 
} 

有沒有寫這個一個更清潔的方式?我知道Observable.of但只有當你需要一個簡短的Observable而沒有複雜的動作的時候。

我知道你可以返回一個HTTP調用。

+0

你在哪裏定義變量'observer' – Aravind

+0

@Aravind這只是角2語法... –

+0

那麼,什麼是你正在尋找? – Aravind

回答

2

如果你指的是結合兩條線,那麼:不,沒有這樣的事情。

但是就像一個旁註:你與你的評論列出的流看起來像一個非常正常的流:Http - > map values - >返回值,並且不應該要求Observable.create - 在多個大型項目中使用RxJS I只能召回2個需要Observable.create的案例,我們可以通過鏈接內置的rxjs-operators來處理其他任何事情。

這是一個很簡單的例子:

myFunction(): Observable<any> { 
    return this.http.get(someAddress) 
     .map(data => data.json()) 
     .map(toClientSideUsableData) 
     .do(data => this.myService.cache = data) 
     .do(raiseAlertIfInvalid); 
} 
+0

我做的不僅僅是獲取數據。我也在保存東西緩存。這就是'.map(toClientSideUsableData)'應該代表什麼?我不熟悉這是做什麼。有時我甚至沒有返回數據。我只是將一些數據分配給一個服務的內存,然後通過調用該服務來呈現視圖。我只是確保在推到不同視圖之前將這些數據加載到服務上。 –

+1

如果您要將數據保存到服務中,您可以使用.do-operator - 當收到數據時將執行該功能,不需要自定義可觀察數據 - 稍後我將編輯我的答案 – olsn

+0

我剛更新了示例 - 代碼在答案 – olsn

0

角2 HTTP默認完成它。看看角源代碼xhr_backend.js

 if (response.ok) { 
      responseObserver.next(response); 
      // TODO(gdi2290): defer complete if array buffer until done 
      responseObserver.complete(); 
      return; 
     } 
相關問題