我有一个嵌套订阅,我认为这不是一个好习惯,即使它通常对我有用,但在一个例子中它可能会导致我出现问题。
我怎么能重写以下所以它不是嵌套订阅?
this.pagesService.postReorderPages(ids).subscribe(res => {
if (res === "ok") {
console.log(res);
this.pagesService.getPages().subscribe(pages => {
this.pagesService.pagesBS.next(pages);
console.log(pages);
});
}
});
答案 0 :(得分:2)
我始终建议人们尽力在其流中保留逻辑,并在订阅或.do()
回调中保留效果。所以我认为你关于避免嵌套订阅的直觉是明确的。
this.pagesService.postReorderPages( ids )
.filter( res => res === 'ok' ) // moved logic from your subscription to stream
.mergeMap( () => this.pagesService.getPages() )
.subscribe( pages => {
this.pagesService.pagesBS( pages );
});
如果您发现自己试图避免嵌套订阅,通常需要联系其中一个*Map
运营商。
在rxjs
中,有四个
mergeMap
concatMap
switchMap
exhaustMap
它们的行为略有不同,所以我无法保证这将完美地实现您的功能。但它们都具有相同的签名,它们存在处理“杂乱”的嵌套订阅(在某些库中有时也称为“高阶”或“元”流)。