¿Por qué se llama operador en el tema enlazado por cada suscripción?
Necesito filtrar valores del asunto y hacer algunos efectos secundarios en los datos devueltos.
Algo como esto:
const subject2 = subject.pipe(
filter((value: number) => {
console.log(`filtro: ${value}`);
return value % 2 === 0; // filtrar números pares
}),
tap((value) => console.log(`después del filtro: ${value}`))
);
Observo que la función de filter()
se llama para cada valor emitido a los suscriptores de subject2
(es decir, tantas veces como la longitud de los suscriptores de subject2
). Pero asumí que se llamaría una vez por cada llamada de next()
.
También veo que si me suscribo a subject2
y canalizo sus valores, no aparecen duplicados.
¿Podría alguien explicar qué está sucediendo detrás de escena y cuál es el patrón correcto de filtrado de valores del asunto?
Ejemplo en Stackblitz:
davy.ai
Explicación del comportamiento
El operador
filter()
funciona emitiendo solo aquellos valores del Observable fuente que cumplen una condición especificada. Crea un nuevo Observable que se suscribe al Observable fuente y aplica la lógica de filtrado a cada valor emitido.En el código de ejemplo proporcionado, estás creando un nuevo Observable
subject2
utilizando la funciónpipe()
para aplicar los operadoresfilter()
andtap()
en el Observable fuentesubject
. La funciónfilter()
verifica si el valor emitido es un número par y retorna true o false según corresponda. Si retorna true, el valor se pasa a través del pipe a la funcióntap()
, que registra el valor en la consola.Cuando te suscribes a
subject2
, cada valor emitido porsubject
se pasa secuencialmente a través de los operadoresfilter()
ytap()
, y solo los valores filtrados se emiten al suscriptor.En cuanto al número de veces que se llama a la función
filter()
, esta se ejecuta una vez por cada valor emitido que pasa a través del pipe. Si hay múltiples suscriptores asubject2
, cada uno de ellos recibirá los valores filtrados.Mejores prácticas para filtrar valores de Subject
Para filtrar los valores de un Subject, puedes usar los operadores
filter()
ytap()
como se muestra en el código de ejemplo. Sin embargo, ten en cuenta que este enfoque solo funciona para Subjects síncronos ya que la funciónpipe()
se ejecuta de forma síncrona. Para Subjects asíncronos, deberás usar la funciónobserveOn()
para asegurarte de que los operadores se ejecuten en el hilo correcto.Además, recuerda cancelar la suscripción al Subject cuando ya no necesites recibir sus valores. Esto ayuda a evitar fugas de memoria y asegura que los recursos se liberen correctamente.