使用异步管道和 RXJS 将转换后的数据重新分配给 Observable

Reassign Observable with transformed data with async pipe and RXJS

我有一个总是 return 的服务 Observable<T>,我无法更改此服务的代码。

我有一个按钮,每当单击该按钮时,我都会调用服务中的方法,它 return 是一个新的 Observable。使用 async 管道,新数据反映在 UI.

现在我想转换该数据。只有当用户单击按钮时才会发生转换。我尝试使用 map 和 return 新数据,但它不起作用。我是不是漏掉了什么重要的东西?

谢谢。我是 RXJS

的新手

Source code and playground on StackBlitz

html

<h1>{{ random$ | async }}</h1>

<button (click)="buttonClick()">Get new Random number</button>

<button (click)="transformButtonClick()">Transform</button>

ts

import { Component, Injectable, OnInit } from '@angular/core';
import { map, Observable, of } from 'rxjs';

@Injectable()
export class Service {
  // Cannot change the code in this class
  public getRandom(): Observable<number> {
    return of(Math.random());
  }
}

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.scss'],
})
export class AppComponent implements OnInit {
  constructor(private service: Service) {}

  public random$: Observable<number> = new Observable<number>();

  ngOnInit(): void {}

  buttonClick(): void {
    this.random$ = this.service.getRandom();
    // I cannot do the transformation here, as I don't know if user want to do it or not
  }

  transformButtonClick(): void {
    // how can I update the random with data * 10?
    this.random$ = this.random$.pipe(
      map((data) => {
        data * 10;
        return data;
      })
    );
  }
}

我可能错了,但看起来你没有在地图运算符中返回 * 10 值。

此外,我认为创建一个新的 observable 来存储转换后的数据而不是将其重新分配给相同的原始 $random observable 可能是个好主意。

// try something like that
export class AppComponent implements OnInit {
  constructor(private service: Service) {}

  public random$: Observable<number> = new Observable<number>();
  public randomTimesTen$: Observable<number> = new Observable<number>();

// ...

  transformButtonClick(): void {
    this.randomTimesTen$ = this.random$.pipe(
      map((data) => {
        return data * 10;
      })
    );
  }