我有一个嵌套订阅,我认为这不是一个好的做法,尽管它通常对我有用,但在某些情况下它可能会给我带来问题。
我如何重写以下内容,使其不是嵌套订阅?
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);
});
}
});
最佳答案
我总是建议人们尽力将逻辑保留在流中,并将效果保留在订阅或.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
它们的行为都略有不同,所以我不能保证这将完美地实现您的功能。但它们都具有相同的签名,并且它们的存在是为了处理“困惑”的嵌套订阅(在某些库中有时也称为“高阶”或“元”流)。
关于Angular 4 - 如何重写嵌套订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46547447/