typescript 如何订阅动态生成的可观察项?

wbgh16ku  于 2022-11-26  发布在  TypeScript
关注(0)|答案(1)|浏览(172)
Obs1$.subscribe((data1) => {
    const generatedStuff = doSomethingFunction(data1);
    
    generatedStuff.Obs2$.subscribe(() => {
        doSomethingElse();
    });
});

这是我目前的解决方案。正如你在上面看到的,我有一个函数doSomethingFunction,它用第一个可观测的数据生成一个对象generatedStuff
此对象包含需要在创建后修改的可观察对象。由于在第一个可观察对象完成之前它不存在,因此无法提前订阅它。
请注意,doSomethingFunctiongeneratedStuff是外部的,不应该修改。
因此,订阅内部订阅是我唯一能想到的解决方案,但我知道这是一个糟糕的做法,所以想知道是否有替代方案。

iecba09b

iecba09b1#

最直接的翻译:

Obs1$.pipe(
  mergeMap((data1) => {
    const generatedStuff = doSomethingFunction(data1);
    return generatedStuff.Obs2$;
  })
).subscribe(() => {
  doSomethingElse();
})

清除杂物:

obs1$.pipe(
  mergeMap(data1 => doSomethingFunction(data1).obs2$)
).subscribe(() => doSomethingElse());

另一种写法也是一样:

obs1$.pipe(
  map(data1 => doSomethingFunction(data1)),
  mergeMap(generatedStuff => generatedStuff.obs2$)
).subscribe(() => doSomethingElse());

如果doSomethingFunctiondoSomethingElse不使用this关键字,是lambda(使用=>语法),或者已经绑定:

obs1$.pipe(
  map(doSomethingFunction),
  mergeMap(generatedStuff => generatedStuff.obs2$)
).subscribe(doSomethingElse);

高阶运算符:

mergeMap是许多高阶算符中的一种,高阶算符的基本功能是订阅动态生成的可观测量。
RxJS将订阅从mergeMap返回的任何可观察值。
这不是唯一的操作符,concatMap、switchMap和exhaustMap都是最流行的操作符,它们有什么作用?它们有什么区别?
观察对象在未定义的时间内发出0-n个值。以您的示例为例,如果obs1$连续发出三个值,会发生什么情况?mergeMap也将连续生成三个动态观察对象。
这三个可观测量是如何相互作用的?

**mergeMap**以与嵌套订阅调用相同的方式来管理它。一旦它生成了所有动态创建的可观测量,它就订阅它们,然后以它们碰巧出现的任何顺序保持传递来自任何可观测源的前向发射。
**concatMap**一次只订阅一个可观察对象。它等待上一个可观察对象完成后再订阅下一个可观察对象。因此,每个新动态创建的可观察对象都在队列中等待。
**switchMap**一次只订阅一个观察值。如果它在前一个观察值仍在运行时获得新的动态观察值,则它只取消前一个观察值。
**exhaustMap**一次只订阅一个可观测量,当它还在运行一个可观测量时,它拒绝生成任何新的动态可观测量,它通过简单地丢弃任何新的可观测量来做到这一点。

你可以看到,mergeMapconcatMap是表亲,它们不会丢失任何信息,它们分别并行或顺序运行可观测量。
类似地,switchMapexhaustMap是表兄弟,它们确实会丢失信息,要么偏向于它们分别接收到的最新的观测值,要么偏向于它们接收到的最早的观测值。

相关问题