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!

ismaestro
fuente
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:

martín
fuente
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.

magikMaker
fuente
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.

Simon_Weaver
fuente
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();
});
inorgánico
fuente