首页 > 解决方案 > Angular 11 - 不推荐使用订阅:使用观察者而不是完整的回调

问题描述

我有一个Angular应用程序,其中开始出现错误subscribe,它们已被弃用。

这是我的订阅:

this.route.params.subscribe(params => {
      this.clienteId = +params['clienteId'];
      this.isNew = !this.clienteId;
      if (!this.isNew) {
        this.clienteService.get(this.clienteId).subscribe(c => {
          this.cliente = c;
          this.formNuevo.patchValue(this.cliente);
        });
      }
    });

这是client-service.tsget):

public get(idClient: number): Observable<Client> {
      return this.http.get<Client>(`${PREFIX}/${idClient}`);
    }

这是新订阅的错误:

在此处输入图像描述

-> 'clienteId'object access via string literals is disallowed (no-string-literal)tslint(1)

-> subscribesubscribe is deprecated: Use an observer instead of a complete callback (deprecation)tslint(1)

如何解决问题并将更改应用到此订阅?

标签: angularrxjs

解决方案


  1. 使用高阶映射运算符,例如switchMap从一个可观察对象映射到另一个对象。尽量避免嵌套订阅。

  2. “错误”主要是由于尝试发送一个或其他回调以进行订阅,同时指定其他回调null。例如。使用nextand completewith nullfor error。它可以通过发送显式指定回调的观察者对象来解决。

尝试以下

import { iif, NEVER } from 'rxjs';
import { switchMap } from 'rxjs/operators';

this.route.params.pipe(
  switchMap(params => {
    this.clienteId = +params['clienteId'];
    this.isNew = !this.clienteId;
    return iif(                        // <-- `iif` for conditional mapping
      () => !this.isNew,
      this.clienteService.get(this.clienteId),
      NEVER                            // <-- don't emit if condition fails
    );
  })
).subscribe({
  next: c => {
    this.cliente = c;
    this.formNuevo.patchValue(this.cliente);
  },
  error: error => {
    // handle error
  },
  complete: () => {
    console.log('Request complete');
  }
});

推荐阅读