Rxjs 取消连续的aynscronous请求链

Rxjs 取消连续的aynscronous请求链,rxjs,Rxjs,假设用户输入触发http请求a,结果为a,应用程序必须发出另一个请求B并显示最终结果 如果收到新的用户输入,则应取消所有http请求 我举的例子是链接开关映射。新单击将中止并重新启动第一个switchMap请求。第一个开关映射的新输出将取消并重新启动第二个开关映射。但是,单击不会重新启动第二个switchMap 我很感激关于如何重新思考这个问题的建议。取消请求是目标,过滤/忽略结果是欺骗:) PS:我看到过一些类似的问题,尽管它们看起来非常具体,但我已经尝试尽可能地通用。只需移动第二个开关映射

假设用户输入触发http请求a,结果为a,应用程序必须发出另一个请求B并显示最终结果

如果收到新的用户输入,则应取消所有http请求

我举的例子是链接开关映射。新单击将中止并重新启动第一个switchMap请求。第一个开关映射的新输出将取消并重新启动第二个开关映射。但是,单击不会重新启动第二个switchMap

我很感激关于如何重新思考这个问题的建议。取消请求是目标,过滤/忽略结果是欺骗:)


PS:我看到过一些类似的问题,尽管它们看起来非常具体,但我已经尝试尽可能地通用。

只需移动第二个
开关映射
,使其直接链接到第一个
开关映射内的
模拟Http

点击$
.switchMap((val)=>{
log('Fetching data A'+val);
返回模拟EHTTP(val+“A”,2000年)
.do((v)=>console.log('received:'+v))
.switchMap(val=>{
console.log('获取数据B')
返回模拟EHTTP(val+“B”,2000年);
});
})
.认购(obFc(“完成”);
然后,当再次单击时,在外部
开关映射中组成的整个链将被取消订阅


此外,内部的
switchMap
将永远不需要切换-因为HTTP observable只会发出一次-因此可以使用
mergeMap

感谢您的解决方案!对于两个嵌套级别,我喜欢这样,但是对于3个或4个连续的请求,嵌套会变得有点混乱。如果你想打开单击,你只需要一个嵌套级别。如回答中所述,内部
switchMap
是冗余的,可以使用
mergeMap
。只需在
mergeMap
之后编写任何您想要的内容。你不需要再筑巢了。啊,好的,是的,我现在明白了。测试和作品的魅力,非常感谢!
function obFc(name) {
  return {
    next: function (x) { console.log(name+ ' - ' + x)  },
    error: function (err) { console.log(name +' error ' + err) },
    complete: function () { console.log(name +' done') },
  }
};

function simulateHttp(val: any, delay:number) {
    return Rx.Observable.of(val).delay(delay);
}

click1$ = Rx.Observable.of('1').delay(1000);
click2$ = Rx.Observable.of('2').delay(4000);

click$ = Rx.Observable.merge( click1$, click2$ );
click$.subscribe( obFc('Click') );

click$
  .switchMap( (val) => {
    console.log('Fetching data A' + val);
    return simulateHttp(val + " A", 2000);
  })
  .do((v)=> console.log('received:' + v))
  .switchMap( val => {
    console.log('Fetching data B')
    return simulateHttp( val + " B", 2000);
  })
  .subscribe( obFc('Finished ') );