重复发射一个主题
Repeating the emission of a Subject
我不明白为什么以下 BehaviourSeubject 没有发出三次
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
运算符的定义,
The repeat(count)
operator returns an Observable that will resubscribe to the source stream when the source stream completes, at most the count
times.
因此,需要完成 source$,在这种情况下为 urls$,以便 repeat 可以执行操作,但 urls$ 是一个行为主题,一旦您使用 urls$.complete()
表示行为主题已完成,您将无法在订阅中收到任何内容。因此,如果您想要行为主体发出的值,则不能使用 repeat
运算符。
现在我们如何解决这个问题?
expand
运算符来拯救我们。 [expand][1]
递归投射源可观察对象发出的值。使用 expand
& take
,我们将能够达到预期的结果。
const numbers = [1, 2, 3, 4];
const urls$ = new BehaviorSubject<number[]>(numbers);
urls$
.pipe(expand(result => urls$), take(3))
.subscribe(console.log);
我不明白为什么以下 BehaviourSeubject 没有发出三次
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
运算符的定义,
The
repeat(count)
operator returns an Observable that will resubscribe to the source stream when the source stream completes, at most thecount
times.
因此,需要完成 source$,在这种情况下为 urls$,以便 repeat 可以执行操作,但 urls$ 是一个行为主题,一旦您使用 urls$.complete()
表示行为主题已完成,您将无法在订阅中收到任何内容。因此,如果您想要行为主体发出的值,则不能使用 repeat
运算符。
现在我们如何解决这个问题?
expand
运算符来拯救我们。 [expand][1]
递归投射源可观察对象发出的值。使用 expand
& take
,我们将能够达到预期的结果。
const numbers = [1, 2, 3, 4];
const urls$ = new BehaviorSubject<number[]>(numbers);
urls$
.pipe(expand(result => urls$), take(3))
.subscribe(console.log);