我可以将管道添加到现有的可观察对象

时间:2019-09-24 23:35:37

标签: javascript rxjs

我想要一个初始化函数来控制我的代码初始化过程以提高可读性-一种路线图。

interface{}

我可以这样做而无需在myObservable$; init() { this.watchChanges() this.updateOptionsOnChange() this.patchValuesOnOptionUpdate(); } watchChanges () { myObservable$ = this.something.pipe( mergeMap(change => hitApi) ) } updateOptionsOnChange() { //here I want to "Add" a pipe to the existing pipes above myObservable$.pipe( tap(add values to an object/array) ) } this.patchValuesOnChanges() { myObservable$.subscribe( set values based on above tap ^ ) }; 中进行其他观察。这只是一个反模式吗?

2 个答案:

答案 0 :(得分:1)

您可以执行myObservable$ = myObservable$.pipe(tap(add values to an object/array))。无法像您描述的那样“就地”更改现有Observable的管道。

然后在patchValuesOnChanges中将两个不同的Observables组合在一起可能会更“主动”,其中一个Observables来自updateOptionsOnChange

答案 1 :(得分:0)

在BehaviorSubject上使用switchMap来切换要使用的可观察女巫。

const { BehaviorSubject, interval } = rxjs;
const { switchMap, map } = rxjs.operators;

let useApi$ = new BehaviorSubject(false);

let switchButton = document.getElementById('switch');

switchButton.addEventListener('click', () => {
  if (useApi$.value) {
    switchButton.innerText = 'Local';
    useApi$.next(false);
  } else {
    switchButton.innerText = 'API';
    useApi$.next(true);
  }
});

let local$ = interval(1000).pipe(map(_ => 'local'));
let api$ = interval(1000).pipe(map(_ => 'api'));

let myObservable$ = useApi$.pipe(
  switchMap(useApi => useApi ? api$ : local$)
);

myObservable$.subscribe(val => { console.log(val); });
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.3/rxjs.umd.min.js"></script>
<button id="switch">Local</button>