Javascript 在RxJS中组合不同类型的观测值,但仅发射来自其中一个的值
我有一个行为主体和两个事件发射器。我需要创建一个Observable,每当BehaviorSubject发出新值或任何EventEmitter发出事件时,该Observable返回BehaviorSubject的最新值。基本上,我不关心EventEmitter发出的事件的值,它们应该只是一个触发器,用于推出BehaviorSubject的最新值 以下是一个例子:Javascript 在RxJS中组合不同类型的观测值,但仅发射来自其中一个的值,javascript,angular,rxjs,reactive-programming,Javascript,Angular,Rxjs,Reactive Programming,我有一个行为主体和两个事件发射器。我需要创建一个Observable,每当BehaviorSubject发出新值或任何EventEmitter发出事件时,该Observable返回BehaviorSubject的最新值。基本上,我不关心EventEmitter发出的事件的值,它们应该只是一个触发器,用于推出BehaviorSubject的最新值 以下是一个例子: 从“rxjs”导入Rx; 从“rxjs/operators”导入{map} 从“@angular/core”导入{EventEmit
从“rxjs”导入Rx;
从“rxjs/operators”导入{map}
从“@angular/core”导入{EventEmitter}
const bSubject=新接收行为主体(“值1”);
const emitter1=新的EventEmitter();
const emitter2=新的EventEmitter();
//我是否应该使用除合并以外的其他方法来创建可观察对象?
//合并可以吗,但我应该使用特殊运算符?
常量myOberservable=Rx.merge(b主体、发射器1、发射器2)
订阅({next:value=>console.log(value)});
emitter1.emit('event1');
b subject.next('value2');
emitter2.emit('event2');
b下一个主体(“值3”);
/**
*它打印:
*价值1
*事件1
*价值2
*事件2
*价值3
*
*但我想把它打印出来:
*价值1
*价值1
*价值2
*价值2
*价值3
*/
听起来像是开关映射的完美例子。我不得不使用startWith
,因为switchMap
的工作方式是,当外部observatable
发出一个值时,它只订阅内部observatable
,因此在emitter1
发出第一个值之前,你实际上不会订阅bSubject
。为了克服这个问题,我使用了startWith
,它为可观察的
提供了一个初始值
从'@angular/core'导入{EventEmitter};
从“rxjs”导入{BehaviorSubject,merge};
从“rxjs/operators”导入{startWith,switchMap};
常量initialValue='value1';
const bSubject=新行为主体(初始值);
const emitter1=新的EventEmitter();
const emitter2=新的EventEmitter();
常量myOberservable=merge(emitter1,emitter2).pipe(switchMap(()=>bSubject),startWith(initialValue));
订阅({next:value=>console.log(value)});
emitter1.emit('event1');
b subject.next('value2');
emitter2.emit('event2');
b下一个主体(“值3”);
/**
*它打印:
*价值1
*价值1
*价值2
*价值2
*价值3
*/
合并合并
,与最新的from
和映射
。顺便说一句,我已经更新了代码片段以启用树抖动
import { merge, BehaviorSubject } from 'rxjs';
import { withLatestFrom, map } from 'rxjs/operators'
import {EventEmitter} from '@angular/core'
const bSubject = new BehaviorSubject('value1');
const emitter1 = new EventEmitter();
const emitter2 = new EventEmitter();
const merged = merge(bSubject, emitter1, emitter2);
const myOberservable = merged.pipe(withLatestFrom(bSubject), map(x => x[1]));
myOberservable.subscribe({ next: value => console.log(value) });
emitter1.emit('event1');
bSubject.next('value2');
emitter2.emit('event2');
bSubject.next('value3');
我只是在玩这个解决方案,但它打印的是value1value2value3
而不是value1value1value2value2value3
。我不太明白为什么,因为根据文档,它应该在每次通知程序发出值时发出。是的,对不起。我不知道sample
不会复制源排放。我将用最新版本更新我的回答我不知道的。这个解决方案甚至比我的更好!谢谢@AmitB。是的,rxjs充满了惊喜。举个例子,我想知道什么时候我会使用它merge(subject,merge(emitter1,emitter2)。pipe(withLatestFrom(subject,(event,value)=>value))