2017-10-19 73 views
2

我有一個函數,有時返回一個值包裝在一個可觀察的和其他時間返回一個普通的值。有沒有一種優雅的方式來獲得價值?目前我正在使用這種策略:優雅的方式來獲得可能或不可觀察的值

let mayBeAnObservable = getData(); 
let resultObservable = mayBeAnObservable instanceof Observable ? mayBeAnObservable : Observable.of(mayBeAnObservable) 
resultObservable.subscribe(resultValue => dostuff(resultValue)); 

有沒有更好的方法來做到這一點?

回答

1

我認爲你做的沒問題。如果你真的想要一個更優雅的解決方案,讓你的getData()總是返回一個Observable。即使不論這使得它不是一個觀察的,只是Observable.of()包住它,就像你已經做了:

const getData =()=>{ 

    let someData = someOperations(); 

    if(normalCondition){ 
     return someData; 
    } 

    if(forWhateverReasonItsNotObservable){ 
     return Observable.of(someData) 
    } 
} 

選擇一個陣營。一個更安全的一面。如果您的服務有機會返回可觀察的數據,最好總是返回Observable。原因?你獲得反應式編程的所有優點 - 可以.map(),你可以.filter(),可以.delay(),你可以.buffer() - 你可以做各種操作的observables;如果你只是把它作爲一個原始值來處理,這可能不太方便。

+0

「getData」函數是我對由Angular定義的接口的支持。我正在測試我們的一些自定義實現,並且不想在可能的情況下更改我正在測試的代碼。但是,我在原則上你應該選擇一個側面,並用它同意你的看法。 – alexwells

1

我使用下面的函數(帶有承諾和普通數據支持):

import { fromPromise } from 'rxjs/observable/fromPromise'; 
import { of } from 'rxjs/observable/of'; 
import { isPromise } from 'rxjs/util/isPromise'; 
import { isFunction } from 'rxjs/util/isFunction'; 

const isObservable = v => isFunction(v.subscribe); 

export default function(data) { 
    if (isObservable(data)) return data; 
    if (isPromise(data)) return fromPromise(data); 
    return of(data); 
} 

我不是它的作者,這裏是原始出處和測試它 - https://github.com/zxbodya/router1-app-template/tree/master/src/utils

相關問題