首页 > 解决方案 > 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; });
}}
  

标签: javascriptangularrxjs

解决方案


forkJoin文档中您可以看到:

这意味着forkJoin不会发出超过一次,然后会完成。如果您不仅需要在传递的可观察对象的生命周期结束时发出组合值,而且还需要在整个生命周期中发出组合值,请尝试combineLatestzip替代。

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

为了改变这种行为,您可以删除.complete()调用并使用:

  • combineLatest在任何新点击上发出价值
  • zip单击两个按钮时发出

推荐阅读