Breaking Changes
General
TS: RxJS requiere TS 4.2
rxjs-compat:
rxjs-compat
no está publicado para v7toPromise: El return type de
toPromise
ahora esT | undefined
en TypeScript, lo cual es correcto, pero puede que rompa algunos builds.Subscription:
add
ya no retorna una referenciaSubscription
innecesaria. Esto se ha hecho para evitar la confusión provocada por un comportamiento obsoleto. Ahora se pueden añadir (y quitar) funciones ySubscriptions
como teardowns a unaSubscription
utilizandoadd
yremove
directamente. Anteriormente a este cambio,remove
solo aceptaba subscriptions.Observable:
lift
ya no está expuesto. NUNCA estuvo documentado que los usuarios finales de la biblioteca debieran crear operadores utilizandolift
. Lift tiene una serie de problemas y siempre fue una implementación interna de RxJS que fue utilizada por algunos usuarios en los primeros albores de la biblioteca, cuando tenía valor: originalmente, el valor delift
era que los Observables . La realidad es que esta funcionalidad no era muy conocida ni utilizada y nunca se documentó, ya que era experimental. Hasta al final de la v7,lift
seguirá existiendo en Observable. Los usuarios de JavaScript Estándar no notarán ninguna diferencia. Sin embargo, los usuarios de TypeScript pueden llegar a tener problemas por el hecho de quelift
ya no sea un miembro de observable. Para evitar esto, se pueden hacer dos cosas:Reescribir los operadores según viene establecido en la documentación, como por ejemplo, que retornen un
new Observable
.Hacer un cast de
any
al Observable y acceder alift
de esta manera.
El primer método es el recomendado si se quieren evitar errores al migrar a la versión 8.
Subscriber:
new Subscriber
ya no recibe 0-3 argumentos. Para crear unSubscriber
con 0-3 argumentos, se puede utilizarSubscriber.create
. Sin embargo, se debe tener en cuenta que no existen apenas razones para crear referenciasSubscriber
directamente, y que tantoSubscriber.create
comonew Subscriber
están obsoletos.onUnhandledError: Los errores que ocurran durante el setup de una suscripción observable después de que la suscripción haya emitido un error o se haya completado ahora se lanzan en su propio call stack. Antes, se hacía una llamada a
console.warn
. Esto puede llegar a ser breaking en casos límite en aplicaciones node, que se hayan configurado para finalizar en casos de excepciones sin gestionar. Si este es tu caso, puedes configurar el comportamiento para que vuelva a ser el deconsole.warn
en el nuevo ajuste de configuración, de la siguiente manera:import { config } from 'rxjs'; config.onUnhandledError = (err) => console.warn(err);
Tipos de error de RxJS Error types Los test que se hayan escrito con expectativas naive acerca de los errores ahora pueden fallar, ya que los errores ahora tienen una propiedad de stack en condiciones. En algunos frameworks de testing, una comprobación de igualdad estricta entre dos instancias de error comprobará los valores en el stack, que ahora puede que sean distintos.
unsubscribe
ya no está disponible vía el contextothis
de las funciones observadores. Para habilitarlo, se debe especificarconfig.useDeprecatedNextContext = true
en la configuración de RxJS encontrada enimport { config } from 'rxjs';
. Téngase en cuenta que habilitar esto puede resultar en una penalización de rendimiento para todas las suscripciones de consumidor.La implementación interna
_unsubscribeAndRecycle
deSubscriber
ha sido eliminada. En su lugar, utilizar objetosSubscription
.El método estático
sortActions
deVirtualTimeScheduler
ya no está expuesto públicamente por nuestros tipos TS.Notification.createNext(undefined)
ya no retornarán la misma referencia cada vez.Las firmas de tipos de
Notification
ydematerialize
ahora son más estrictas, por lo que pueden surgir errores por tipos inválidos pasados a estos operadores.El soporte experimental de
for await
se ha eliminado. En su lugar se debe utilizar https://github.com/benlesh/rxjs-for-await .ReplaySubject
ya no programa emisiones cuando se le proporciona un scheduler. Si se necesita ese comportamiento, se debe componerobserveOn
utilizandopipe
. Por ejemplo:new ReplaySubject(2, 3000).pipe(observeOn(asap))
rxjs-compat:
rxjs/Rx
ya no es un sitio de importación válido.
Operadores
concat
concat
: Ha cambiado su firma de genéricos. Se recomienda que no se le pasen genéricos explícitamente, sino dejar que la inferencia haga su trabajo. Si es necesario, hacer un cast con as
. of
: Ha cambiado su firma de genéricos. No especificar genéricos, permitir que sean inferidos o utilizar as
.
count
count
: Ya no se pasa el Observable fuente como tercer argumento. Esta funcionalidad raramente se utilizaba, y no proporcionaba demasiado valor.
defer
defer
: Ya no permite factorías que retornen void
o undefined
. Todas las factorías proporcionadas a defer
deben retornar un ObservableInput
, como por ejemplo Observable
, Promise
, et al. Para obtener el mismo comportamiento que anteriormente, se puede utilizar return EMPTY
o return of()
en la factoría.
map
map
: El valor por defecto de thisArg
es ahora undefined
. El anterior valor por defecto de MapSubscriber
no tenía sentido. Este cambio afectará únicamente al código que haga una llamada a map
con una función y referencie al this
de la siguiente manera: source.pipe(map(function () { console.log(this); }))
. Hacer esto nunca ha sido útil, por lo que se espera que el código afectado sea mínimo.
mergeScan
mergeScan
: mergeScan
dejará de emitir su estado interno otra vez tras la compleción.
of
of
: El uso con más de 9 argumentos, donde el último argumento es un SchedulerLike
puede resultar en el tipo erróneo que incluye el SchedulerLike
, aunque la implementación en tiempo de ejecución no lo permita. Se debe utilizar scheduled
en su lugar.
pairs
pairs
: pairs
ya no funcionará en IE win un polyfill para Object.entries
. Además, el propio operador pairs
está obsoleto. Utilizar from(Object.entries(obj))
en su lugar.
race
race
: race()
ya no se suscribirá a observables subsecuentes si la fuente proporcionada se completa o produce un error de forma síncrona. Esto quiere decir que los efectos colaterales que puedieran ocurrir durante la suscripión en esos casos raros ya no ocurrirán.
repeat
Se ha eliminado un comportamiento indocumentado donde al pasar un argunento count
negativo resultaba en un Observable que se repetía indefinidamente.
retry
Se ha eliminado un comportamiento indocumentado donde al pasar un argunento count
negativo resultaba en un Observable que se repetía indefinidamente.
single
El operador single
ahora lanza un error en aquellas situaciones en las que los valores entrantes no están presentes, o no coinciden con el predicado proporcionado. Los tipos de errores también se han actualizado, compruébese la documentación para ver los cambios.
skipLast
skipLast
: skipLast
ya no provocará un error cuando se le pase un número negativo. En su lugar, retornará el Observable fuente, al igual que hace si se le pasa el valor 0.
startWith
startWith
: startWith
retornará tipos incorrectos al ser llamado con más de 7 argumentos y un scheduler. Pasarle un scheduler a startWith
ahora está obsoleto.
take
take
ahora lanzará un runtime error para argumentos negativos o NaN. Esto incluye llamadas no-TS como take()
.
takeLast
takeLast
ahora tiene runtime assertions que lanzan TypeErrors
para argumentos inválidos. Llamar a takeLast
sin argumentos o con un argumento NaN lanzará un TypeError
.
throwError
throwError
: throwError
ya n o es capaz de emitir una función como error directamente. Si se necesita emitir una función como error, se podrá utilizar la función factoría para retornar la función de la siguiente manera: throwError(() => functionToEmit)
, en otras palabras: throwError(() => () => console.log('llamado después'))
timestamp
El operador timestamp
acepta un TimestampProvider
, que es cualquier objeto con un método now
que retorne un número. Esto puede causar problemas con el modo run del TestScheduler
. (ver Issue aquí)
zip
zip
: Hacerle zip a un solo arrray ahora tendrá un resultado diferente. Esto es un caso límite raro, ya que es muy poco probable que alguien quiera hacerle zip a un array con nada. El workaround sería encapsular el array en otro array: zip([[1,2,3]])
. Aunque, como se ha dicho antes, es algo bastante raro.
zip
: Los operadores zip
ya no iterarán a través de los iterables proporcionados de manera "as needed". En su lugar, los iterables se tratarán como push-streams, tal y como se hace siempre en RxJS. Esto quiere decir que si se proporciona un iterable infinito, el hilo se bloqueará, ya que se intentará leer del iterable indefinidamente. Este cambio alinea RxJS con las demás implementaciones de Rx. Como workaround de este caso, se puede utilizar map
o una combinación de map
y zip
. Por ejemplo zip(source$, iterator)
podría pasar a ser source$.pipe(map(value => [value, iterator.next().value]))
.
ajax
La serialización del cuerpo de ajax
utilizará ahora el comportamiento por defecto de XHR en todos los casos. Si el cuerpo es un Blob
, ArrayBuffer
cualquier vista de array buffer (como una secuencia de bytes, ej: Uint8Array
, etc.), FormData
, URLSearchParams
, string
, o ReadableStream
, se utilizará el manejo por defecto. Si el cuerpo es un typeof "object"
, entonces se convertirá a JSON mediante JSON.stringify
y la cabecera Content-Type
será application/json;charset=utf-8
. Cualquier otro tipo provocará un error.
La cabecera Content-Type
pasada a la configuración de ajax
ya no tendrá ningún efecto sobre el comportamiento de serialización de la petición AJAX.
Para usuarios de TypeScript, AjaxRequest
ya no corresponde al tipo que debe utilizarse explícitamente para crear un ajax
, sino que ahora es AjaxConfig
. Aunque los dos tipos son compatibles, solamente AjaxConfig
tiene progressSubscriber
y createXHR
.
ajax
: En el siguiente caso límite extremo: Si ocurre un error, el responseType es "json"
, estamos utilizando IE y el responseType no es un JSON válido, el observable ajax
no emitirá un error de sintaxis, sino que emitirá un AjaxError
completo con más detalles.
ajax
: La implementación ajax deja de dar soporte a IE10 y versiones anteriores. Esto alinea RxJS con otras implementaciones y ayuda a limpiar el código en ese ámbito.
Last updated