javascript - rxjs forkJoin 只发出一次值
问题描述
我正在尝试了解 fork 如何加入 rxjs 操作员行为,并进行了一些测试。我发现在 fork Join 发出第一个值之后,它的取消订阅或完成(不确定)并且不能产生任何值。这是对的吗 ? 我的代码在这里 “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; });
}}
解决方案
从forkJoin
文档中您可以看到:
这意味着
forkJoin
不会发出超过一次,然后会完成。如果您不仅需要在传递的可观察对象的生命周期结束时发出组合值,而且还需要在整个生命周期中发出组合值,请尝试combineLatest
或zip
替代。
这就是您的示例中发生的情况:单击 1 次后,流被competed
忽略,下一个值被忽略。
为了改变这种行为,您可以删除.complete()
调用并使用:
combineLatest
在任何新点击上发出价值zip
单击两个按钮时发出
推荐阅读
- java - 从另一个访问一个 jar 文件时出现问题
- laravel - 如何让 vue 组件等到数据准备好渲染?
- rtf - Apache Tika:无法使用 {\*\objclass Outlook.FileAttach} 从 RTF 文件中提取嵌入对象
- reactjs - React Hooks 将在等待后多次渲染
- javascript - 当数据存在和数据不存在时使用 css 定位 div
- reactjs - 在屏幕中渲染 html 后突出显示多个单词
- python - DrawBoundingBoxes 的 Tensorflow 形状排名错误
- c - 如何在c中将静态数组转换为动态数组?
- typescript - 如何键入包含一个或多个字符串集合的字符串数组?
- c# - 如何将传入消息映射到 Azure Eventhub 中的使用者组