Rxjs 作为行为主体的可观察对象(使用默认值可观察)

Rxjs 作为行为主体的可观察对象(使用默认值可观察),rxjs,Rxjs,我正在尝试合并来自3个不同流的最新值,忽略其中一个(或多个)尚未发出任何值 const myStream1$:Observable<>=// steam from somewhere, myStream2$:Observable<string>=// steam from somewhere, myStream3$:Observable<string>=// steam from somewhere; Obse

我正在尝试合并来自3个不同流的最新值,忽略其中一个(或多个)尚未发出任何值

   const myStream1$:Observable<>=// steam from somewhere,
         myStream2$:Observable<string>=// steam from somewhere,
         myStream3$:Observable<string>=// steam from somewhere;

   Observable.combineLatest(myStream1$, myStream2$, myStream3$)
      .do(([valFromStream1, valFromStream2, valFromStream3])=>
    {
       // I want to do some side-effect operation even if one(or all) of those 3 streams hasn't emit any value yet
    })
    .takeUntil(terminator$)
    .subscribe();

const myStream1$:Observable=//来自某处的蒸汽,
myStream2$:可观=//来自某处的蒸汽,
myStream3$:可观=//来自某处的蒸汽;
可观察。组合测试(myStream1$、myStream2$、myStream3$)
.do([valFromStream1,valFromStream2,valFromStream3])=>
{
//我想做一些副作用操作,即使这3个流中的一个(或全部)还没有发出任何值
})
.takeUntil(终止符$)
.subscribe();
如何做到这一点

我可以使用下一个逻辑实现这一点(但它和sh*t一样难看),我想应该有一个操作符可以神奇地自动实现这一点:

   const myStream1$:Observable<string>=// steam from somewhere,
         myStream2$:Observable<string>=// steam from somewhere,
         myStream3$:Observable<string>=// steam from somewhere;

   const subj1 = new BehaviorSubject<string>(undefined),
         subj2 = new BehaviorSubject<string>(undefined),
         subj3 = new BehaviorSubject<string>(undefined);

   myStream1$
      .do((val)=>{
      subj1.next(val);
    }).subscribe();

   myStream2$
      .do((val)=>{
      subj2.next(val);
    }).subscribe();

   myStream3$
      .do((val)=>{
      subj3.next(val);
    }).subscribe();

   Observable.combineLatest(subj1, subj2, subj3)
      .do(([valFromStream1, valFromStream2, valFromStream3])=>
    {
       // I want to do some side-effect operation even if one of those 3 streams hasn't emit any value yet
    })
    .takeUntil(terminator$)
    .subscribe();


const myStream1$:Observable=//来自某处的蒸汽,
myStream2$:可观=//来自某处的蒸汽,
myStream3$:可观=//来自某处的蒸汽;
const subject 1=新行为主体(未定义),
Subject 2=新的行为Subject(未定义),
Subject 3=新行为主体(未定义);
myStream1$
.do((val)=>{
1.下一步(val);
}).subscribe();
myStream2$
.do((val)=>{
2.下一步(val);
}).subscribe();
myStream3$
.do((val)=>{
3.下一步(val);
}).subscribe();
可观察。组合测试(主题1、主题2、主题3)
.do([valFromStream1,valFromStream2,valFromStream3])=>
{
//我想做一些副作用的操作,即使这3个流中的一个还没有发出任何值
})
.takeUntil(终止符$)
.subscribe();

您可以通过使用空值启动每个流来强制CombineTest发出,然后您可以根据值是否为空有条件地执行逻辑

combineLatest(myStream1$.startWith(null),
myStream2$.startWith(null),
myStream3$.startWith(null))
.do(([v1,v2,v3])=>{
....
}).takeUntil(terminator$)

您可以使用“合并”或“平面映射”来实现相同的操作。出现错误:错误范围错误:超过最大调用堆栈大小您能给我看一下流的源代码吗?或者制作一个简单的stackbliz来演示,因为代码假设可以工作。好吧,这是我的新手错误,我订阅了几个控件的值更改,在do中我禁用/启用了它们。可能对其他人有用: