DEV Community

Cover image for Utilizando Operadores para Trabalhar com Eventos e Dados em Angular
Levy Henrique Alves Nunes
Levy Henrique Alves Nunes

Posted on

Utilizando Operadores para Trabalhar com Eventos e Dados em Angular

Angular, em combinação com RxJS, oferece uma abordagem poderosa e flexível para trabalhar com eventos e dados assíncronos. A magia muitas vezes está nos operadores do RxJS que nos permitem transformar, filtrar, combinar e lidar com estes fluxos de dados de diversas maneiras. Neste post, mergulharemos profundamente em como você pode usar os operadores do RxJS para aprimorar sua experiência Angular.

1. Introdução aos Operadores

Operadores são funções puras que permitem a transformação de Observáveis. Eles são a espinha dorsal do RxJS e permitem uma manipulação complexa e declarativa de streams de dados.

Os operadores podem ser categorizados em:

  • Criação: Como of, from, interval.
  • Transformação: Como map, pluck, switchMap.
  • Filtragem: Como filter, debounceTime, distinctUntilChanged.
  • Combinação: Como merge, combineLatest, concat.
  • Erro Handling: Como catchError, retry.

2. Trabalhando com Eventos

Uma das aplicações mais comuns dos operadores RxJS em Angular é para lidar com eventos, como cliques do usuário, entradas de formulário e muito mais.

Exemplo: Filtrando Rapidamente Entradas de Usuário

Imagine que você quer fazer uma pesquisa enquanto o usuário digita em uma caixa de entrada, mas quer esperar até que o usuário pare de digitar por pelo menos 500ms (para evitar chamadas de API desnecessárias):

import { Component, OnInit } from '@angular/core';
import { FormControl } from '@angular/forms';
import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';

@Component({
  selector: 'app-pesquisa',
  template: `
    <input [formControl]="campoPesquisa">
  `
})
export class PesquisaComponent implements OnInit {

  campoPesquisa = new FormControl();

  ngOnInit() {
    this.campoPesquisa.valueChanges.pipe(
      debounceTime(500),
      distinctUntilChanged(),
      switchMap(termo => this.buscarDados(termo))
    ).subscribe(resultado => {
      console.log(resultado);
    });
  }

  buscarDados(termo: string) {
    // Aqui, faça sua chamada de API ou busca de dados.
  }
}
Enter fullscreen mode Exit fullscreen mode

Aqui, debounceTime garante que esperemos 500ms após a última alteração antes de prosseguir. distinctUntilChanged garante que não façamos a busca se o termo de pesquisa não mudou. switchMap é usado para lidar com a chamada assíncrona, garantindo que apenas a mais recente seja considerada.

3. Trabalhando com Dados

RxJS é excelente para lidar com dados, especialmente em situações onde os dados são recebidos assincronamente.

Exemplo: Combinando Dados de Múltiplas Fontes

Suponha que você tenha dois endpoints de API e queira combinar os resultados:

import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { combineLatest } from 'rxjs';
import { map } from 'rxjs/operators';

@Component({
  selector: 'app-dados-combinados',
  template: `
    <!-- Seu template aqui -->
  `
})
export class DadosCombinadosComponent implements OnInit {

  dadosCombinados: any;

  constructor(private http: HttpClient) {}

  ngOnInit() {
    const dados1$ = this.http.get('https://api.meusite.com/dados1');
    const dados2$ = this.http.get('https://api.meusite.com/dados2');

    combineLatest([dados1$, dados2$]).pipe(
      map(([dados1, dados2]) => {
        return { ...dados1, ...dados2 };
      })
    ).subscribe(resultado => {
      this.dadosCombinados = resultado;
    });
  }
}
Enter fullscreen mode Exit fullscreen mode

Aqui, combineLatest é usado para combinar os resultados dos dois observáveis. O operador map é usado para transformar a estrutura dos dados como desejado.

4. Manipulação de Erros

Em qualquer aplicação, você inevitavelmente encontrará erros, especialmente ao lidar com operações assíncronas como chamadas de API.

import { catchError } from 'rxjs/operators';
import { of } from 'rxjs';

// ...

meuObservable.pipe(
  catchError(err => {
    console.error('Ocorreu um erro:', err);
    return of([]); // Retorna um valor padrão
  })
).subscribe(/* ... */);
Enter fullscreen mode Exit fullscreen mode

O operador catchError permite que você intercepte e trate erros, e até substitua o valor emitido no caso de um erro.

Conclusão

O RxJS e seus operadores oferecem uma ferramenta poderosa para manipular eventos e dados em aplicações Angular. Com uma compreensão sólida de como usar esses operadores, você pode escrever código mais limpo, eficiente e reativo. Mergulhe nos operadores e experimente-os em seus projetos Angular para explorar seu verdadeiro potencial!

Top comments (0)