【问题标题】:rxjs forkJoin emit value only oncerxjs forkJoin 只发出一次值
【发布时间】:2020-09-26 16:54:56
【问题描述】:

我正在尝试了解 fork 如何加入 rxjs 运算符的行为,并进行了一些测试。我发现在 fork Join 发出第一个值之后,它的取消订阅或完成(不确定)并且不能产生任何值。这是对的吗 ? My code here"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; });
}}
  

【问题讨论】:

    标签: javascript angular rxjs


    【解决方案1】:

    forkJoin documentation你可以看到:

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

    这就是您的示例中发生的情况:在 1 次点击后流是 competed 并且忽略下一个值。

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

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

    【讨论】:

    • 谢谢,这是我的想法。但是,如果您删除 .complete() 叉连接将不会发出任何值,因为他正在等待所有其他 observable 完成。 (很好的文档)
    猜你喜欢
    • 2020-02-26
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多