[英]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()))
)
...
但問題是dialogRef
是Promise
,我需要在使用實例 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.