Observables y RxJS en Angular
- Observables: Son una característica central de RxJS y representan un flujo de datos que puede ser observado. Los Observables son utilizados en Angular para manejar eventos asincrónicos, como solicitudes HTTP, interacciones del usuario y otras operaciones que no se completan instantáneamente.
- RxJS (Reactive Extensions for JavaScript): Es una biblioteca para programación reactiva que utiliza Observables para manejar y componer eventos asincrónicos y flujos de datos. En Angular, RxJS es ampliamente utilizado para manejar la programación reactiva de manera eficiente.
- RxJS     https://rxjs.dev/6-to-7-change-summary 
Componentes de Observables y RxJS en Angular
- Observable: Representa una fuente de datos que puede ser observada.
- Observer: Es un consumidor de valores entregados por un Observable.
- Operators: Funciones puras que permiten trabajar con Observables para modificar, filtrar, combinar y realizar otras operaciones sobre flujos de datos.
- Subscription: Representa la ejecución de un Observable y permite cancelar la suscripción a un flujo de datos.
- Subject: Es un tipo especial de Observable que permite la multicasting de valores a múltiples Observers.
Videotutoriales:
- Curso Angular 2023 #9 Libreria RxJS Observables vs Subject https://youtu.be/GuTBTMYMIbs
- Observables y RxJS https://youtu.be/BOouK6J8pqg
- Observables en Angular   https://youtu.be/96HouMe0o5M  
- Async pipe en Angular  https://youtu.be/38Tif0tbH0M
- Observables ? compartir información https://youtu.be/k0MPZxqzu8k
-  Diferencias entre promises y observables     https://youtu.be/6HVLS6-G97o
- ..
- Cursos - RxJS en Angular    https://youtu.be/zV0NywULR_4
Interpretación de cada componente
Observable:
- Clase que representa una secuencia de eventos asincrónicos.
import { Observable } from 'rxjs';
const observable = new Observable(subscriber => {
  subscriber.next('Hello');
  subscriber.next('World');
  subscriber.complete();
});
Observer:
- Interfaz que define cómo manejar los valores entregados por un Observable.
const observer = {
  next: (value: any) => console.log(value),
  error: (err: any) => console.error(err),
  complete: () => console.log('Complete')
};
Operators:
- Funciones que operan en Observables para transformar, filtrar o combinar flujos de datos.
import { map } from 'rxjs/operators';
observable.pipe(
  map(value => value.toUpperCase())
).subscribe(observer);
Subscription:
- Objeto que representa la ejecución de un Observable.
const subscription = observable.subscribe(observer);
// Para cancelar la suscripción
subscription.unsubscribe();
Subject:
- Observable que permite emitir y escuchar valores.
import { Subject } from 'rxjs';
const subject = new Subject();
subject.subscribe(observer);
subject.next('Hello');
subject.next('World');
subject.complete();
Ejemplo de Observables y RxJS 
Configuración del módulo:
// app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
})
export class AppModule {}
Servicio Angular:
// data.service.ts
import { Injectable } from '@angular/core';
import { Observable, of } from 'rxjs';
import { delay } from 'rxjs/operators';
@Injectable({
  providedIn: 'root'
})
export class DataService {
  getData(): Observable <string[]> {
    const data = ['Angular', 'RxJS', 'TypeScript'];
    return of(data).pipe(delay(1000)); // Simular retraso de red
  }
}
Componente Angular: 
// app.component.ts
import { Component, OnInit } from '@angular/core';
import { DataService } from './data.service';
import { Observable } from 'rxjs';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
  data$: Observable<string[]>;
  constructor(private dataService: DataService) {}
  ngOnInit() {
    this.data$ = this.dataService.getData();
  }
}
Plantilla HTML:
<!-- app.component.html -->
<div>
<h1>Data from Observable</h1>
<ul>
<li *ngFor="let item of (data$ | async)">{{ item }}</li>
</ul>
</div>
Explicación del Ejemplo:
- Servicio - DataService:- Define un método getDataque retorna un Observable que emite un array de strings después de un retraso simulado de 1 segundo.
 
- Define un método 
- Componente - AppComponent:- Inyecta el servicio DataServicey usa el métodogetDatapara obtener un Observable.
- El Observable es asignado a la propiedad data$y se suscribe automáticamente en la plantilla usando el pipeasync.
 
- Inyecta el servicio 
- Plantilla HTML: - Usa el pipe asyncpara suscribirse al Observable y renderizar los datos una vez que están disponibles.
 
- Usa el pipe 
Este ejemplo demuestra cómo usar Observables y RxJS en Angular para manejar datos asincrónicos de manera eficiente y reactiva.
mmm