Saya mencoba membuat metode pengambil praktis untuk nilai ReplaySubject saat ini. Saya pikir saya akan menggunakan metode .toPromise dan menggunakan sintaks menunggu async untuk itu. Sesuatu seperti ini:

get latestResults(): number[] {
  return (async () => {
    return await this._result$.pipe(take(1)).toPromise();
  })();
}

Namun saya mendapatkan kesalahan yang menunjukkan bahwa menunggu sebenarnya tidak memenuhi janji:

Ketik 'Janji' tidak memiliki properti berikut dari jenis 'angka[]': panjang, pop, push, concat, dan 25 lainnya.

Juga mencoba:

async getLatestResults(): number[] {
  return await this._result$.pipe(take(1)).toPromise();
}

Dan stack blitz. Bagian "Hasil Tembolok" seharusnya menggunakan logika yang dimaksud.

0
Frederick 10 Maret 2020, 22:28

1 menjawab

Jawaban Terbaik

Jangan gunakan toPromise() dan async/menunggu. Sebaliknya selalu kembalikan Observable.

@Injectable({ providedIn: 'root' })
export class TestState  {

  private readonly _result$ = new ReplaySubject<number[]>(1);

  get results(): Observable<number[]> {
    return this._result$.asObservable();
  }

  updateResults(newResults: number[]): void {
    this._result$.next(newResults);
  }

  getLatestResults(): Observable<number[]> {
    return await this.results.pipe(take(1));
  }
}

Jangan berlangganan di Fasad itu, jangan implementasikan OnDestroy di Fasad itu, Anda harus melakukan perilaku seperti ini di dalam komponen. Anda seharusnya hanya memiliki satu yang dapat diamati dan data yang di-cache mengalir ke satu aliran yang Anda cetak dalam html melalui pipa async.

@Component({
  selector: 'my-app',
  templateUrl: './app.component.html',
  styleUrls: [ './app.component.css' ]
})
export class AppComponent  {
  name = 'Angular';
  value: number;
  result$: Observable<number[]>;
  subject: Subject<void> = new Subject();

  constructor(private readonly _test: TestFacade) {
    this.result$ = this._test.pipe(takeUntil(this.subject)).getLatestResults();
  }

  ngOnInit() {}

  ngOnDestroy() {
    this.subject.next();
    this.subject.complete();
  }
}

Harap berikan informasi lebih lanjut tentang caching itu dengan contoh kehidupan nyata. Saya tidak pernah memiliki situasi di mana saya membutuhkan ReplaySubject. Misalnya jika Anda ingin men-cache permintaan http ada operator rxjs untuk itu (shareReplay). Jika Anda ingin menyimpan data dalam keadaan, Anda dapat menyimpan semacam informasi yang validHingga yang akan mengatakan bahwa data tidak perlu dimuat ulang hingga beberapa Tanggal.

0
mare.zim 10 Maret 2020, 21:25