【问题标题】:How to unsubscribe from own written Observable?如何取消订阅自己编写的 Observable?
【发布时间】:2020-12-03 03:38:32
【问题描述】:

我有 2 个 observables 函数

      putToLs(lang): Observable<any> {
        this.languageService.setLanguage(lang);
        return of(true)
      }

      refreshPage(): Observable<any> {
        return of(this.route.url);
      }

我在另一个函数中使用它们

 changeLang(lang) {
    const allLangs = this.translate.getLangs();
    this.chosenLang = lang;
    this.listOfLang = [...allLangs].filter(item => item !== this.chosenLang);
    this.translate.use(lang);
    this.putToLs(lang).subscribe(val => {
      if (val) {
        this.refreshPage().subscribe(val => {
          console.log(val)
          this.route.navigate([val]);
        })
      }
    })
  }

如您所见,我创建了自己的 observable 来等待语言设置为 putToLs(lang)。如何取消订阅 this.putToLs(lang).subscribethis.refreshPage().subscribe ,我已经看到我可以使用 pipe(takeUntil(variable)) 但我不知道应该将哪个变量放入 takeUntil()
P.S: 一般来说,我应该退订自己的 Observable 吗?我读过一篇关于 Medium 的文章,他们说我应该始终取消订阅 observable 以避免内存泄漏

【问题讨论】:

    标签: angular


    【解决方案1】:

    您可以将订阅函数分配给订阅变量。

    您可能应该每次都取消订阅以前的refreshPageSub,因为每次调用第一个订阅时您都会创建一个新订阅。

    let refreshPageSub;
    const putToLsSub = this.putToLs(lang).subscribe(val => {
          if (val) {
            refreshPageSub && refreshPageSub.unsubscribe();
            refreshPageSub = this.refreshPage().subscribe(val => {
              console.log(val)
              this.route.navigate([val]);
            })
          }
        })
    

    然后,完成后只需在您的putToLsSub 上拨打unsubscribe()

    putToLsSub.unsubscribe();
    

    【讨论】:

    • 如果我将函数保存到 const 订阅,我的代码可以工作吗?我的意思是我正在调用我的函数 this.putToLs(lang).subscribe 然后订阅结果。如果我只是保存在变量中,它将不会被调用,不是吗?
    • 它仍然会被调用。您只是保存订阅,因此您可以取消订阅。由于您正在订阅另一个订阅,因此您只需在顶层为内部订阅创建一个变量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 2020-03-29
    相关资源
    最近更新 更多