angular 4 - 如何重写嵌套订阅

时间:2017-10-03 14:50:31

标签: 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);
                        });
                    }
                });

1 个答案:

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

  1. mergeMap
  2. concatMap
  3. switchMap
  4. exhaustMap
  5. 它们的行为略有不同,所以我无法保证这将完美地实现您的功能。但它们都具有相同的签名,它们存在处理“杂乱”的嵌套订阅(在某些库中有时也称为“高阶”或“元”流)。