【问题标题】:Subscription on behavior subject gets incremented by one行为主题的订阅增加一
【发布时间】:2019-02-15 00:43:32
【问题描述】:

我正在尝试对我的代码进行故障排除。 我希望订阅会在 .next() 和初始化时触发。

但它第一次触发一次,然后我离开并返回组件并触发下一个,它会触发两次。 我导航离开并返回,它会触发三次。

我检查了所有调用 .next() 的函数,它们只被触发一次,但订阅仍在增加。

我的行为主体在服务内,当我点击一个组件时,它会调用服务内的下一个函数。

关于我可以在哪里检查问题或如何检查的任何想法

【问题讨论】:

    标签: angular behaviorsubject


    【解决方案1】:

    从您的描述看来,您并没有取消订阅组件中的 BehaviorSubject。如果您不取消订阅,那么每次初始化该组件(导航到它)时,您都会创建一个对行为主题的新订阅。由于您在导航离开时没有取消订阅该 BehaviorSubject,因此该订阅保持活动状态。因此,当您第二次返回时,会创建另一个订阅,然后您会开始收到多个 next() 通知。这种行为称为内存泄漏。

    在您订阅行为主题的组件中,您需要执行以下操作:

    export class AppComponent implements OnInit, OnDestroy {
      private mySub;
    
      constructor(private yourService: YourService){}
    
      ngOnInit(){
        this.mySub = this.yourService.yourBehaviorSubject.subscribe({
          next: _ => //Do stuff
        });
      }
    
      ngOnDestroy(){
        this.mySub.unsubscribe();
      }
    
    }
    

    这当然是关于您的根本问题是什么的猜测,因为您没有提供任何代码!如果我的怀疑是错误的,请提供一些代码。那将有很大帮助! :)

    【讨论】:

    • 感谢您的意见。我也想过这个。我很难创建一个小代码示例。但是我添加了一个 unsub 函数,但之后我会得到可观察到的 unsub 错误。所以我很困惑。无论如何,我最终可能会重构整个事情
    【解决方案2】:

    您需要在将组件保留为时取消订阅

      ngOnInit(){
        this.subscriptionObj1 = this.service.behaviorSubject1.subscribe({
    
        });
    
        this.subscriptionObj2 = this.service.behaviorSubject2.subscribe({
    
        });
      }
    
      ngOnDestroy(){
        this.subscriptionObj1.unsubscribe();
        this.subscriptionObj2.unsubscribe();
      }
    

    或者,如果您懒得检查所有代码中出现的所有主题订阅。 :)

    只需添加 pipe(first()) 它将在第一次执行后自动取消订阅对象。

    import { first, take } from 'rxjs/operators';
    
     ngOnInit(){
            this.service.behaviorSubject1.pipe(first()).subscribe({
    
            });
            this.service.behaviorSubject2.pipe(first()).subscribe({
    
            });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多