【问题标题】:angular 4 - How to rewrite nested subscriptionangular 4 - 如何重写嵌套订阅
【发布时间】:2017-10-03 14:50:30
【问题描述】:

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

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

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);
                        });
                    }
                });

【问题讨论】:

标签: angular


【解决方案1】:

我始终建议人们尽最大努力将逻辑保留在他们的流中,并将效果保留在订阅或.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

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

【讨论】:

    猜你喜欢
    • 2019-12-24
    • 2021-11-18
    • 2020-12-09
    • 1970-01-01
    • 2022-08-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-25
    • 2018-12-20
    相关资源
    最近更新 更多