轻松取消将你的观察取消订阅

    你必须在组件或指令级别提供 SubscriptionService,因为它没有在根中提供,而且它与组件/指令的生命周期同步. 只有在此之后,您才能注入并开始使用它。

    count$ 发出的值将被记录下来,直到组件被销毁. 你不必手动退订.

    1. @Component({
    2. /* class metadata here */
    3. providers: [SubscriptionService],
    4. })
    5. class DemoComponent implements OnInit {
    6. constructor(private subscription: SubscriptionService) {}
    7. ngOnInit() {
    8. const source$ = interval(1000);
    9. const nextFn = value => console.log(value * 2);
    10. const errorFn = error => {
    11. console.error(error);
    12. return of(null);
    13. };
    14. this.subscription.addOne(source$, nextFn, errorFn);
    15. }

    或者,你可以传递一个观察者.

    addOne 方法返回单个订阅以便你以后使用它. 有关详细信息,请参见下面的主题.

    有两种方法可以做到这一点. 如果你不想再次订阅.可以使用 closeAll 方法.

    1. @Component({
    2. providers: [SubscriptionService],
    3. })
    4. class DemoComponent implements OnInit {
    5. constructor(private subscription: SubscriptionService) {}
    6. ngOnInit() {
    7. this.subscription.addOne(interval(1000), console.log);
    8. }
    9. onSomeEvent() {
    10. this.subscription.closeAll();
    11. }
    12. }

    有时你可能需要取消订阅特定的订阅,但保留其他订阅. 在这种情况下,你可以使用 closeOne 方法.

    1. @Component({
    2. /* class metadata here */
    3. providers: [SubscriptionService],
    4. })
    5. class DemoComponent implements OnInit {
    6. countSubscription: Subscription;
    7. constructor(private subscription: SubscriptionService) {}
    8. ngOnInit() {
    9. console.log
    10. );
    11. }
    12. onSomeEvent() {
    13. this.subscription.closeOne(this.countSubscription);
    14. console.log(this.countSubscription.closed); // true
    15. }
    16. }

    你可能需要控制特定的订阅. 在这种情况下你可以使用 removeOne 方法将其从跟踪的订阅中删除.

    使用 isClosed 检查 closeAll 是否被调用.

    1. @Component({
    2. /* class metadata here */
    3. providers: [SubscriptionService],
    4. })
    5. class DemoComponent implements OnInit {
    6. constructor(private subscription: SubscriptionService) {}
    7. ngOnInit() {
    8. this.subscription.addOne(interval(1000), console.log);
    9. }
    10. onSomeEvent() {
    11. console.log(this.subscription.isClosed); // false
    12. }