优雅的方式来获得可能或不可观察的值
问题描述:
我有一个函数,有时返回一个值包装在一个可观察的和其他时间返回一个普通的值。有没有一种优雅的方式来获得价值?目前我正在使用这种策略:优雅的方式来获得可能或不可观察的值
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
;如果你只是把它作为一个原始值来处理,这可能不太方便。
答
我使用下面的函数(带有承诺和普通数据支持):
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
“getData”函数是我对由Angular定义的接口的支持。我正在测试我们的一些自定义实现,并且不想在可能的情况下更改我正在测试的代码。但是,我在原则上你应该选择一个侧面,并用它同意你的看法。 – alexwells