Ionic 2 Provider Observable Unsubscribing

时间:2017-07-22 20:15:48

标签: ionic2 observable

我正在开发一个离子应用程序,而且我有一个关于什么时候取消订阅供应商中使用的可观察对象的问题。目前我正在做的是在页面上我检查在进入页面之前是否验证了使用。然后,如果他们经过身份验证,我将从firebase返回用户数据。这是页面上使用的功能

ionViewCanEnter() {

return new Promise((resolve, reject) => {
  this.auth.isBusiness()
    .then(user => {
      this.currentUser = user;
      resolve(true);
    })
    .catch(error => {
      console.log(error);
      this.presentToast()
      reject(false)
    });
});
}

我调用的函数存在于提供程序中。从提供者我订阅了来自firebase的用户数据。我离开页面并在提供程序上调用dispose时,我正在使用takeUntil来处理此observable的取消订阅。我的问题是当我尝试重新导航到我已经取消订阅destroy $变量的页面时。我不应该从提供者内部取消订阅可观察者,因为在页面中使用相同的提供者而不是重新初始化或者我需要做的其他事情。每当我加载页面时,是否需要为提供程序手动调用init函数?

private destroy$: Subject<any>
 public isBusiness() {
    return new Promise((resolve, reject) => {
      this.isAuthenticated()
        .then(user => {
          this.userProvider.getUser(user["uid"]).takeUntil(this.destroy$).subscribe(searchedUser => {
            if (searchedUser.userType === "business") {
              resolve(searchedUser);
            } else {
              reject("You are not a business");
            }
          })
        }).catch(err => {
          reject(err);
        });
    });
  }
  public dispose() {
    this.destroy$.next(true);
    this.destroy$.unsubscribe();
  }

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用以下订阅来实现此目的,

import { Subscription } from "rxjs/Subscription";

服务中创建一个变量

private subscriptions: Subscription[]=[];

当您订阅Observable时,将其推入数组

public isBusiness() {
    return new Promise((resolve, reject) => {
      this.isAuthenticated()
        .then(user => {
        this.subscriptions
            .push(
                this.userProvider
                    .getUser(user["uid"])
                    .takeUntil(this.destroy$)
                    .subscribe(searchedUser => {
                        if (searchedUser.userType === "business") resolve(searchedUser);
                        else reject("You are not a business");
                    }))
        }).catch(err => {
          reject(err);
        });
    });
}

当页面被破坏时,你可以

public dispose() {
    this.subscriptions.forEach(item=>{
    item.unsusbscribe();
    });

}

当销毁该组件时调用dispose方法。