Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在RxJS中组合不同类型的观测值,但仅发射来自其中一个的值_Javascript_Angular_Rxjs_Reactive Programming - Fatal编程技术网

Javascript 在RxJS中组合不同类型的观测值,但仅发射来自其中一个的值

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

我有一个行为主体和两个事件发射器。我需要创建一个Observable,每当BehaviorSubject发出新值或任何EventEmitter发出事件时,该Observable返回BehaviorSubject的最新值。基本上,我不关心EventEmitter发出的事件的值,它们应该只是一个触发器,用于推出BehaviorSubject的最新值

以下是一个例子:

从“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))