微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

重复发射一个主题

如何解决重复发射一个主题

我不明白为什么下面的 BehavIoUrSeubject 没有发出 3 次

const numbers = [1,2,3,4]
const urls$ = new BehaviorSubject<number[]>(numbers)

urls$.pipe(repeat(3)).subscribe(console.log)

另外,下面的语义是什么?

urls$.pipe(switchMap(arr => from(arr)),repeat(3)).subscribe(console.log)

我也希望重复三遍,但唯一可行的情况是

urls$.pipe(switchMap(arr => from(arr).pipe(repeat(3)))).subscribe(console.log)

解决方法

根据repeat运算符的定义,

repeat(count) 操作符返回一个 Observable,它会在源流完成时重新订阅源流,最多 count 次。

因此,在这种情况下,source$ 是 urls$ 需要完成以便重复可以执行,但 urls$ 是一个行为主体,一旦你用 urls$.complete() 表示行为主体完成,你就赢了'无法接收订阅中的任何内容。因此,如果您想拥有行为主体发出的值,则不能使用 repeat 运算符。

现在我们如何解决这个问题?

expand 运算符来拯救我们。 [expand][1] 递归地投影源 observable 发出的值。使用 expand & take,我们将能够达到预期的结果。

const numbers = [1,2,3,4];
const urls$ = new BehaviorSubject<number[]>(numbers);

urls$
  .pipe(expand(result => urls$),take(3))
  .subscribe(console.log);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。