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