La suscripción está en desuso: use un observador en lugar de una devolución de llamada de error


94

Cuando ejecuto el linter, dice:

subscribe is deprecated: Use an observer instead of an error callback

Código (de una aplicación angular 7 con angular-cli):

    this.userService.updateUser(data).pipe(
       tap(() => {bla bla bla})
    ).subscribe(
       this.handleUpdateResponse.bind(this),
       this.handleError.bind(this)
    );

No sé exactamente qué debo usar y cómo ...

¡Gracias!


1
* así que intente usar.subscribe({ next: this.handleUpdateResponse.bind(this), error: this.handleError.bind(this) })
kos

No consigo que funcione con mi apiRest
Javier

Respuestas:


134

subscribeno está en desuso, solo la variante que estás usando está en desuso. En el futuro, subscribesolo tomará un argumento: el nextcontrolador (una función) o un objeto observador.

Entonces, en su caso, debe usar:

.subscribe({
   next: this.handleUpdateResponse.bind(this),
   error: this.handleError.bind(this)
});

Vea estos problemas de GitHub:


6
idk ... flotando en vs code todavía se muestra obsoleto con esa sintaxis (rxjs 6.5.3)
Yannic Hamann

6
Hola @YannicHamann, este comentario explica por qué. No está en desuso, simplemente desaprobaron una de las sobrecargas y ahora parece que todo está en desuso. Es principalmente un problema de herramientas.
Dean

Creo que esta respuesta ya no es válida ya que todos los métodos de suscripción están obsoletos ahora en rxjs 6.5.4
Alok Rajasukumaran

39

Quizás sea interesante notar que el observerObjeto también puede (todavía) contener el complete()método y otras propiedades adicionales. Ejemplo:

.subscribe({
    complete: () => { ... }, // completeHandler
    error: () => { ... },    // errorHandler 
    next: () => { ... },     // nextHandler
    someOtherProperty: 42
});

De esta forma es mucho más fácil omitir ciertos métodos. Con la firma antigua era necesario suplir undefinedy ceñirse al orden de los argumentos. Ahora es mucho más claro cuando, por ejemplo, solo se proporciona un controlador siguiente y completo.


10

Puede obtener este error si tiene un objeto escrito como Observable<T> | Observable<T2>- en lugar de Observable<T|T2>.

Por ejemplo:

    const obs = (new Date().getTime() % 2 == 0) ? of(123) : of('ABC');

El compilador no hace obsde tipo Observable<number | string>.

Puede que le sorprenda que lo siguiente le dé el error Use an observer instead of a complete callbackyExpected 2-3 arguments, but got 1.

obs.subscribe(value => {

});

Es porque puede ser de dos tipos diferentes y el compilador no es lo suficientemente inteligente como para reconciliarlos.

Necesita cambiar su código para regresar en Observable<number | string>lugar de Observable<number> | Observable<string>. Las sutilezas de esto variarán según lo que esté haciendo.


2

Recibí la advertencia porque estaba pasando esto para suscribirme:

myObs.subscribe(() => someFunction());

Dado que devuelve un solo valor, era incompatible con subscribela firma de la función.

Cambiar a esto hizo que la advertencia desapareciera (devuelve nulo / nulo);

myObs.subscribe(() => {
  someFunction();
});
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.