Argumentos subscribe

Es posible que se haya visto que algunas firmas del método subscribe están obsoletas, lo que puede haber causado confusión. El método subscribe en sí no está obsoleto. Este cambio afecta también al operador tap, ya que tap posee la misma firma que el método subscribe.

Este cambio existe en preparación para un futuro en el que se permitirá la configuración de subscribe mediante el segundo argumento, para casos como AbortSignal o similares (por ejemplo source$.subscribe(fn, { signal })). Este cambio también se ha hecho debido a que tener 2-3 argumentos puede hacer que el código sea poco legible. Por ejemplo, se podrían elegir nombres poco adecuados para las funciones y confundir al lector:

source$.subscribe(doSomething, doSomethingElse, lol)

Con esta firma, se necesita conocer el funcionamiento de subscribe, mientras que si se utiliza un observador parcial no es necesario:

source$.subscribe({ next: doSomething, error: doSomethingElse, complete: lol })

Este cambio se introdujo en RxJS 6.4.

En resumen, todas las firmas en las que se especifica una callback error o complete anónima y se pasa una función vacía a una de las callbacks están obsoletas.

Qué firmas han sido afectadas

Todas las firmas de suscribe que reciben más de un argumento ahora están obsoletas.

Las firmas para pasar únicamente la callback complete están obsoletas.

import { of } from 'rxjs';

// Obsoleto
of([1,2,3]).subscribe(null, null, console.info); // difficult to read
// Sugerencia
of([1,2,3]).subscribe({complete: console.info});

De manera parecida, las firmas para pasar únicamente la callback error están obsoletas.

import { throwError } from 'rxjs';

// Obsoleto
throwError('I am an error').subscribe(null, console.error);

// Sugerencia
throwError('I am an error').subscribe({error: console.error});

En general se recomienda utilizar la función anónima solo si se especifica la callback next. En cualquier otro caso se recomienda pasar un Observador.

import { of } from 'rxjs';

// Recomendado
of([1,2,3]).subscribe((v) => console.info(v));

// También se recomienda
of([1,2,3]).subscribe({
next: (v) => console.log(v),
error: (e) => console.error(e),
complete: () => console.info('complete')
})

Last updated