簡體   English   中英

如何解決在 Rxjs 中發送到 Subject 參數的 promise?

[英]How to resolve a promise that sent to Subject parameters in Rxjs?

我將Promise作為參數傳遞給Subject

const work = new Subject<{ id: number; dialogRef: Promise<typeof Dialog> }>();

我想稍后使用promise內部的實例:

...
exhaustMap(({ id, dialogRef }) =>
  http.get({ id }).pipe(tap(() => dialogRef.close()))
)
...

但問題是dialogRefPromise ,我需要在使用實例 function ( close() )之前解決它。

我能夠做到這一點的一種方法是使用async await ,但這個解決方案對我不利。 因為我想用“rxjs”的方式來做。

我正在尋找可以解決此 promise 並將其傳遞給exhaustMap操作員的操作員或 function。 類似的東西:

 resolve(({ dialogRef }) => dialogRef),
 exhaustMap(({ id, dialogRef }) => //<-- dialogRef is NOT promise. it's instance
      http.get({ id }).pipe(tap(() => dialogRef.close()))
 )

我可以用 rxjs 做嗎?

堆棧閃電戰

import { of, Subject } from 'rxjs';
import { exhaustMap, tap } from 'rxjs/operators';
console.clear();

const http = {
  get: ({ id }) => of(`data: ${id}`),
};

const Dialog = {
  close: () => {
    console.log('in close!');
  },
};

const work = new Subject<{ id: number; dialogRef: Promise<typeof Dialog> }>();

work
  .pipe(
    exhaustMap(({ id, dialogRef }) =>
      http.get({ id }).pipe(tap(async () => (await dialogRef).close()))
    )
  )
  .subscribe((r) => {
    console.log({ r });
  });

work.next({ id: 1, dialogRef: Promise.resolve(Dialog) });

像這樣? https://stackblitz.com/edit/rxjs-geomjb

work.pipe(
    concatMap(({ id, dialogRef }) => forkJoin({ id: of(id), dialogRef })),
    exhaustMap(({ id, dialogRef }) => http.get({ id }).pipe(tap(() => dialogRef.close())))
).subscribe(...);

像這樣使用concat

work.pipe(
  exhaustMap(({id, dialogRef}) => concat(http.get(id), dialogRef.close()))
).subscribe()

如果你想在dialogRef.close之后運行http.get ,只需為其添加defer

work.pipe(
  exhaustMap(({id, dialogRef}) => concat(
    http.get(id),
    defer(() => dialogRef.close())
  ))
).subscribe()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM