Javascript rxjs forkJoin只发出一次值

Javascript rxjs forkJoin只发出一次值,javascript,angular,rxjs,Javascript,Angular,Rxjs,我试图理解fork如何连接rxjs操作符的行为,并做了一些测试。我发现fork-Join发出第一个值后,它的unsubscribe或complete(不确定)不能生成任何值。对吗? “rxjs”forkjoin“示例” 从所附的代码中。只有在点击两个按钮后,forkJoin才能按预期发出observable 1和observable 2的值。但是第二次我做了这个测试。点击按钮1、2,什么也没发生。这种行为没有记录在案,我也不确定我是否做错了什么。有人能给我澄清一下吗?谢谢 import { Co

我试图理解fork如何连接rxjs操作符的行为,并做了一些测试。我发现fork-Join发出第一个值后,它的unsubscribe或complete(不确定)不能生成任何值。对吗? “rxjs”forkjoin“示例”

从所附的代码中。只有在点击两个按钮后,forkJoin才能按预期发出observable 1和observable 2的值。但是第二次我做了这个测试。点击按钮1、2,什么也没发生。这种行为没有记录在案,我也不确定我是否做错了什么。有人能给我澄清一下吗?谢谢

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { BehaviorSubject, combineLatest, forkJoin, from, fromEvent, 
interval, Observable, of, zip } from 'rxjs';
import { delay, map, take } from 'rxjs/operators';

 @Component({
  selector: 'my-app',
  template: ` 
    RXJS EXAMPLE. See Console

     <button (click)="test1()"> click 1</button> 
    <button (click)="test2()"> click 2</button> 
     <div *ngIf="data">
    {{data}}
 
    </div>
   `,  
})

export class AppComponent  {

   private source1 = new BehaviorSubject<number>(1);
   obs1$ = this.source1.asObservable();
  private source2 = new BehaviorSubject<number>(1);
   obs2$ = this.source2.asObservable();

test1(){

 var randomVal = Math.floor(Math.random() * 10)*2;
 this.source1.next(randomVal);
 this.source1.complete();

}

test2(){  
 var randomVal = Math.floor(Math.random() * 10);
 this.source2.next(randomVal);
 this.source2.complete(); 
 }

 constructor() {
   forkJoin([ this.obs1$,  this.obs2$])
  .subscribe(res => {
   this.data = res; });
}}
  
从'@angular/core'导入{Component,OnInit};
从'@angular/common/http'导入{HttpClient};
导入{BehaviorSubject,CombineTest,forkJoin,from,fromEvent,
“rxjs”的间隔,可观察的,of,zip};
从'rxjs/operators'导入{delay,map,take};
@组成部分({
选择器:“我的应用程序”,
模板:`
RXJS示例。请参阅控制台
单击1
点击2
{{data}}
`,  
})
导出类AppComponent{
私有源1=新行为主体(1);
obs1$=this.source1.asObservable();
私有源2=新行为主体(1);
obs2$=this.source2.asObservable();
test1(){
var randomVal=数学地板(数学随机()*10)*2;
this.source1.next(randomVal);
this.source1.complete();
}
test2(){
var randomVal=Math.floor(Math.random()*10);
this.source2.next(randomVal);
this.source2.complete();
}
构造函数(){
forkJoin([this.obs1$,this.obs2$]))
.订阅(res=>{
this.data=res;});
}}
从中可以看到:

这意味着,
forkJoin
将不会发出超过一次的信息,并将在这之后完成。如果您不仅需要在传递的观测值的生命周期结束时发出组合值,还需要在整个生命周期中发出组合值,请尝试使用
combinelatetest
zip

这就是您的示例中发生的情况:单击1次后,流已竞争,下一个值被忽略

要更改此行为,可以删除
.complete()
调用并使用:

  • CombineTest
    以在任何新单击时发出值
  • zip
    在单击两个按钮时发出

谢谢,大家都这么想。但是,如果删除.complete()forkjoin,它将不会发出任何值,因为它正在等待所有其他可观察对象完成。(well documnet)