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

时间:2017-10-19 14:38:34

标签: rxjs

我有一个函数有时返回一个包含在observable中的值,其他时候返回一个普通值。是否有一种优雅的方式来获得价值?目前我正在使用这种策略:

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

我觉得你做的很好。如果您真的想要更优雅的解决方案,请让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 - 您可以对此进行各种操作<plugin> <groupId>com.googlecode.maven-download-plugin</groupId> <artifactId>download-maven-plugin</artifactId> <version>1.3.0</version> <executions> <execution> <phase>package</phase> <goals> <goal>wget</goal> </goals> <configuration> <url>https://testserver.com/svn/development/documents/Operations_Manual.docx</url> <outputFileName>Operations Manual.docx</outputFileName> <outputDirectory>${project.build.directory}</outputDirectory> </configuration> </execution> </executions> ;如果你只是将它作为一个原始值来处理它可能不那么方便。

答案 1 :(得分:1)

我正在使用以下函数(支持Promises和普通数据):

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