Angular 4 - 如何重写嵌套订阅

标签 angular

我有一个嵌套订阅,我认为这不是一个好的做法,尽管它通常对我有用,但在某些情况下它可能会给我带来问题。

我如何重写以下内容,使其不是嵌套订阅?

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中,有四个

  1. mergeMap
  2. concatMap
  3. switchMap
  4. exhaustMap

它们的行为都略有不同,所以我不能保证这将完美地实现您的功能。但它们都具有相同的签名,并且它们的存在是为了处理“困惑”的嵌套订阅(在某些库中有时也称为“高阶”或“元”流)。

关于Angular 4 - 如何重写嵌套订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46547447/

相关文章:

Angular 生成大型 react 形式的最佳方法是什么?

angular - 不能在属性选择器中使用 mat-tab

http - 如何在 2 个 HTTP 请求将值返回到存储后触发 NgRx 操作

Angular2 使用组件外部的动画

javascript - 如何解决 setAttribute() 函数中 'boolean' 类型的参数不可分配给 'string' 类型的参数错误

javascript - AG-Grid:根据服务器的响应制作可编辑的列

angular - 如何清除 Angular 响应式(Reactive)表单输入值

javascript - 为什么当我返回数组而不是回调函数中的某些原语时,map 的工作方式有所不同?

Angular2 :"Select"选项应该被选中并且默认可见

Angular 5 Material Paginator 在更新 pageIndex 时重置为负值