javascript – 了解rxjs中的SwitchMap

根据switchMap的定义

On each emission the previous inner observable (the result of the
function you supplied) is cancelled and the new observable is
subscribed. You can remember this by the phrase switch to a new
observable.

现在,我有一个像这样的代码

const source = timer(0, 5000).pipe(map(x=>`${x}`));
const example = source.pipe(switchMap((f) => interval(1000).pipe(map(y=>`f${f}-s${y}`))),take(20));
const subscribe = example.subscribe(val => console.log(val+' '+ new Date().getSeconds()));

结果是这样的

javascript  – 了解rxjs中的SwitchMap

我的问题是,

>第25秒 – 调用外部函数并且尚未触发内部函数,因此外部函数的最新值为0,内部函数也是默认值0,因为它没有值f0-s0 25
> 26th second – 调用内部函数,理想情况下该值应该为0,因为函数刚刚被调用,但它是1即. f0-s1 26
> 30th second – 调用外部函数,将内部函数值重置为0,即. f1-s0 30
>为什么内部功能在第35秒重置,它仍然是1秒

stackblitz link

我觉得很难理解这个概念,谢谢

解决方法:

我想,你错误地认为你的音源开始以25秒的速度发光,而它是从24秒开始的.并且没有“默认0”.

源在t0发出,然后在1s内部间隔将发出.在您从源计时器切换到另一个值之前,内部间隔将有5秒钟发出4或5次.如果您的源计时器开始以24秒发射,那么您将获得订阅的第一个值是25秒 – 当间隔将发出其第一个值时.

4或5次的原因是在RxJS和JS调度中.请参阅此stackblitz for a rough example可能发生的事情.详细解释这将需要更多的研究工作和时间.

下面是一张大理石图,描绘了mergeMap与exhaustMap vs switchMap vs concatMap的行为,以便更好地理解:

javascript  – 了解rxjs中的SwitchMap

检查这个mergeMap vs exhaustMap vs switchMap vs concatMap playground.

上一篇:javascript – Angular2路由保护返回Observable,如何处理错误


下一篇:javascript – 为什么first()rxjs运算符会继续返回数组