Página Inicial

Como cancelar requests ao digitar na barra de pesquisa

Parte de network do inspecionar do chrome mostrando vários requests 'search' cancelados e um com status 200

Vamos lá, você está fazendo um input de pesquisa que vai atualizar a cada palavra digitada e quer cancelar o request anterior quando uma nova palavra for digitada, assim não sobrecarregando seu backend? Pois eu tenho a solução! (talvez não seja a melhooor solução, mas é o que achei)

O código a seguir está em Vue, mas acho que se você trabalha com React não vai ser nada muito diferente (na verdade tem um artigo melhor que o meu explicando como fazer em react, então se você entende inglês da uma olhada aqui. E se você trabalha com Angular aparentemente ele já tem uma solução pra isso chamada switchMap. Dito tudo isso, vamos ao código.

Primeiramente você vai precisar importar o axios no script do seu componente:

// Search.vue

import axios from 'axios'

export default {
...
}

Então vamos precisar criar uma variável cancelToken no data, com o valor inicial undefined :

data() {
  return {
    cancelToken: undefined,
  }
}

Aí, na função onde você for fazer a chamada para a pesquisa, você vai adicionar as seguintes linhas:

methods: {
  search(query) {
    // Esse if serve para verificar se não existe nenhum request anterior pendente.
    // Caso exista ele vai cancela-lo (a mensagem é opcional)
    if (typeof this.cancelToken !== typeof undefined) {
      this.cancelToken.cancel("Operation canceled due to new request.")
    }

    // A seguir a gente salva o token de cancelamento do request atual
    this.cancelToken = axios.CancelToken.source()

    // E ai você vai mandar esse token no seu dispatch (assumindo que você esteja usando vuex)
    this.$store.dispatch('search_term', {
      query,
      cancel: this.cancelToken.token
    })
  }
}

Então, lá onde esta função vai estar na sua store, você vai adicionar o cancelToken na sua chamada para o axios:

// search.js

import axios from 'axios'

// ...
actions: {
  search_term({}, payload) {
    // Aqui eu estou fazendo um get, mas funciona em post também
    axios.get('search',
     { query: payload.query },
     { cancelToken: payload.cancel })
    .then(res => {
      // ...
    })
  }
}
// ...

E é basicamente isso! Eu deixei algumas coisas de fora para o código ficar o mais focado possivel, mas espero que tenha dado para entender. Qualquer coisa pode comentar que eu ajeito aqui e se você tiver uma solução melhor comenta aí tbm que estamos todos aqui pra aprender. Até a próxima aí galera!

Quer ficar sabendo quando houverem novos posts aqui no blog? Agora você pode! Basta se juntar ao meu canal no telegram.