Динамически обновлять наблюдаемый объект или номер типа - PullRequest
1 голос
/ 24 апреля 2020

У меня есть наблюдаемая переменная, которую я намерен динамически обновлять после получения результата от другой наблюдаемой. Мой код как ниже

import { of } from 'rxjs';

let total = of(0);

observer.subscribe(x => {
  const add = (n) => + 1; 
  total.pipe(scan(add, 4)) //
  total = total.pipe(scan(add, 4)); // works but doesn't update or change total on subsequent changes.
});

Я новичок в rx JS, любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Это демонстрирует, как динамически накапливать сумму:

Компонент

import { Component } from "@angular/core";
import { of, Observable, Subject } from "rxjs";
import { scan, tap } from "rxjs/operators";

@Component({
  selector: "my-app",
  templateUrl: "./app.component.html",
  styleUrls: ["./app.component.css"]
})
export class AppComponent {
  amount = new Subject<number>();
  amount$ = this.amount.asObservable();

  total$ = this.amount$.pipe(
    scan((acc, amt) => acc + amt),
    tap(console.log)
  );

  doClick() {
    this.amount.next(4);
  }
}

HTML

<button (click)="doClick()">Add 4</button>
<p>Result: {{ total$ | async }}</p>

Или, как ранее предлагалось, вы можете использовать BehaviorSubject и начать с 0.

Вы можете найти рабочую версию этого кода здесь:

https://stackblitz.com/edit/angular-adder-deborahk

Также обратите внимание, что вы не должны пытаться изменить поток, используя такой синтаксис:

myStream = myStream.pipe(...);
0 голосов
/ 24 апреля 2020

Похоже, BehaviorSubject может решить ваше дело.

let total$ = new BehaviorSubject(0);

observer.subscribe(x => {
  // ...
  total$.next(valueYouWantItToEmit);
});
...