首页 > 解决方案 > 看不到 RXJS 如何确定在多个订阅上重复共享操作的哪一部分

问题描述

学习文档中讨论的运算符share()显示了两个示例,说明使用它和不使用它的结果如何。我理解为什么副作用只显示一次 - 这是因为我们共享源。我也尝试检查官方文档,但它给了我一点智慧。

我不明白为什么我们会看到每个订阅的主要结果。我知道这是预期的结果,但我看不出计算机如何知道什么是副作用和什么是主要影响。

const source = timer(1000);
const example = source.pipe(
  tap(() => console.log("side-effect)),
  mapTo("main-effect")
);

const shared = example.pipe(share());
const go1 = shared.subscribe(val => console.log(val));
const go2 = shared.subscribe(val => console.log(val));

标签: typescriptrxjs

解决方案


如果我理解你的问题是正确的,那么答案很简单:share() 运算符之前的所有内容都只会执行一次。share() 运算符之后的所有内容都将执行与订阅一样多的次数。

在上面的示例中,首先将只有一个从计时器初始化的流。每一秒你都会有一个事件,首先是点击,然后是 mapTo,然后是共享。共享后,流分成两个不同的流,每个订阅一个。

timer -> tap -> mapTo -> share -> 分成两个不同的流

mapTo 运算符创建一次字符串“main-effect”,然后将其发送到管道中。当流被一分为二时,字符串“main-effect”被复制并发送给两个订阅者,这就是他们都收到字符串的原因。


推荐阅读