优雅的方式来获得可能或不可观察的值

优雅的方式来获得可能或不可观察的值

问题描述:

我有一个函数,有时返回一个值包装在一个可观察的和其他时间返回一个普通的值。有没有一种优雅的方式来获得价值?目前我正在使用这种策略:优雅的方式来获得可能或不可观察的值

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

有没有更好的方法来做到这一点?

我认为你做的没问题。如果你真的想要一个更优雅的解决方案,让你的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

我使用下面的函数(带有承诺和普通数据支持):

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