[英]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.