Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Desafio: qual operador posso usar? ERREI... fiz sem o operador

Na verdade, o resultado me pareceu o mesmo (ou não). Em Fim...

Criei uma propriedade q: string = '' iniciando com vazio, e adicionei ao filter a condição valorDigitado != this.q, atualizando a propriedade no switchMap:

    this.livrosEncontrados$ = this.campoBusca.valueChanges
    .pipe(
      debounceTime(PAUSA),
      filter((valorDigitado) => {return valorDigitado.length >= 3 && valorDigitado != this.q;}),
      switchMap((valorDigitado) => {this.q = valorDigitado; return this.service.buscar(valorDigitado)}),
      map((items) => { 
        if(items) {
          return this.livrosResultadoParaLivros(items);
        } else {
          return null;
        }
      })
    );
1 resposta
solução!

Olá Marcus! Tudo bem contigo?

Uma possível solução para evitar requisições duplicadas é utilizar o operador distinctUntilChanged. Esse operador permite que apenas valores distintos sejam emitidos pelo fluxo. Dessa forma, se o valor digitado não for alterado, a requisição não será repetida.

Você pode adicionar o operador distinctUntilChanged logo após o filter, ficando assim:

this.livrosEncontrados$ = this.campoBusca.valueChanges
  .pipe(
    debounceTime(PAUSA),
    filter((valorDigitado) => valorDigitado.length >= 3 && valorDigitado != this.q),
    distinctUntilChanged(),
    switchMap((valorDigitado) => {this.q = valorDigitado; return this.service.buscar(valorDigitado)}),
    map((items) => { 
      if(items) {
        return this.livrosResultadoParaLivros(items);
      } else {
        return null;
      }
    })
  );

Dessa forma, o operador distinctUntilChanged irá garantir que apenas valores distintos sejam passados para o operador switchMap, evitando requisições duplicadas.

Espero ter ajudado, abraços e bons estudos!