web-dev-qa-db-fra.com

Annuler axios get request lors de la saisie de reactjs

Je crée une fonction de saisie semi-automatique, donc, fondamentalement, chaque fois que je tape dans la zone de recherche, cela annule la précédente requête get http. J'ai vérifié la saisie semi-automatique de l'interface utilisateur jQuery et c'est ce qu'ils ont fait. Est-ce possible dans axios si oui comment puis-je l'implémenter. Jusqu'à présent, voici mon code pour http get request:

export function autocompleteSearchTest(value){
    return axios.get(`https://jqueryui.com/resources/demos/autocomplete/search.php`,{
        params: {
            q: value
        }
    })
    .then(response => {
        return response.data.response;
    })
    .catch(error => {
        const result = error.response;
        return Promise.reject(result);
    });
}

Voici la capture d'écran lorsque je tape dans la zone de recherche:

enter image description here

comme vous pouvez le voir, il n'annule pas la précédente requête get http.

9
Sydney Loteria

Depuis axios v0.15, vous pouvez annuler la demande:

Vous pouvez également créer un jeton d'annulation en passant une fonction d'exécuteur au constructeur CancelToken:

var CancelToken = axios.CancelToken;
var cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
});

// cancel the request
cancel();

Pour plus d'informations, veuillez consulter Annulation . Et selon votre code:

import React from 'react'
import axios from 'axios';

export function autocompleteSearchTest(value) {
    if (cancel != undefined) {
        cancel();
    }
    return axios.get(`https://jqueryui.com/resources/demos/autocomplete/search.php`, {
        cancelToken: new CancelToken(function executor(c) {
            // An executor function receives a cancel function as a parameter
            cancel = c;
        }),
        params: {
            q: value
        }
    })
        .then(response => {
            return response.data.response;
        })
        .catch(error => {
            const result = error.response;
            return Promise.reject(result);
        });
}

var CancelToken = axios.CancelToken;
var cancel;

export class AutoComplete extends React.Component {

    constructor() {
        super()
        this.state = {
            search: ''
        };
        this.handleSearchChange = this.handleSearchChange.bind(this);
    }

    handleSearchChange(event) {
        const target = event.target;
        const value = target.value;
        this.setState({
            search: value
        });
        autocompleteSearchTest(value)
    }

    render() {
        return (
            <div className="App-intro Dialog-section">
                <h2>AutoComplete</h2>
                <div className="form-control">
                    <label htmlFor="password">Lookup :</label>
                    <input name="search" type="text" value={this.state.search}
                           onChange={this.handleSearchChange}
                           id="password" ref="password" placeholder="Enter line"/>
                </div>
            </div>
        )
    }
}

export default AutoComplete;

Et ici c'est enter image description here

22
Vladislav Kysliy

Vous pouvez créer un si petit wrapper d'assistance et l'utiliser partout où vous devez annuler la demande précédente:

// ../services.js

function createApi(baseURL) {
  const axiosInst = axios.create({
    baseURL,
  });

  axiosInst.defaults.headers.common['Content-Type'] = 'application/json';
  
  return (type = 'get') => {
    let call = null;
    return (url, data, config) => {
      if (call) {
        call.cancel('Only one request allowed!');
      }
      call = axios.CancelToken.source();
      const extConf = {
        cancelToken: call.token,
        ...config,
      };
      switch (type) {
        case 'request':
          return api[type](extConf);

        case 'get':
        case 'delete':
        case 'head':
          return api[type](url, extConf);

        default:
          return api[type](url, data, extConf);
      }
    };
  };
}

export const baseApi = createApi('http://localhost:5000/api/')

Et puis utilisez-le n'importe où comme ceci:

import baseApi from '../servises.js';

const fetchItemsService = baseApi('post');

//...
componentDidMount() {
  fetchItemsService('/items').then(() => {});
}
//...
1
Alexander Yamkov

utilisez faxios

// building..
let req = faxios()
  .baseURL("http://jsonplaceholder.typicode.com")
  .url("posts", 1, "comments")

// fetching..
req // => 
  .FETCH // => Promise
  .then(res => {})
  .catch(err => {});

// canceling...
req.cancel();
1
challenger

Vous voulez utiliser quelque chose comme RxJS pour cela, alors vous pouvez retarder l'entrée si les utilisateurs recherchent, avant que les demandes soient faites.

0
Kieran Grosvenor

utilisation: react, axios et redux-axios-middleware

actions de l'utilisateur:

import axios from 'axios';
import * as type from 'constants/user';

const CancelToken = axios.CancelToken;
let cancel;

export const addUser = (data) => {
  if (cancel !== undefined) cancel();

  return ({
    types: [type.ADD_USER_REQUEST, type.ADD_USER_SUCCESS, type.ADD_USER_FAILURE],
    payload: {
      request: {
        url: '/api/user',
        cancelToken: new CancelToken(c => cancel = c),
        method: 'POST',
        data,
      },
    },
  });
};
0
Andrii Vielkov