반응형
    
    
    
  이전 요청 실시간 검색 응답 취소
실시간 검색 axios 요청으로 이전 요청을 취소해야 함- 요청을 하기 위해 스로틀 디바운싱을 사용하고 있지만 기존 단어가 지워지고 새 값이 업데이트되는 경우 문제가 있음 - 일부 경우 이전 단어에 대한 결과가 표시되고 있으므로 동일한 요청에 대한 이전 요청을 모두 취소해야 할 것임ID, 기사들을 읽어보지만, 그 중 아무도 내 활용 사례에 해당되지 않는다.어떤 도움도 내 코드야
환원기:
switch (action.type) {
case GETTING_DATA:
  return {
    ...state,
    results: action.payload,
  };
case SEARCH_DATA:
  return {
    ...state,
    Results: action.payload,
  };
export function getSearch(value) {
  return (dispatch) => {
    dispatch({
      type: GETTING_DATA,
    });
    const arg = {
      search: value,
    };
    apiGet('abc', arg).then(response => 
     getResults(dispatch, response));
  };
}
const getResults = (dispatch, response) => {
  dispatch({
    type: SEARCH_DATA,
    payload: response.data,
  });
};
 
서비스:
export const apiGet = async (path = '', args = {}) => {
  const endpoint = "/aaa/aaa/aaa";
  try {
    return axios.get(endpoint, getConfig());
  } catch (e) {
  }
};
다음을 시도해 보십시오.
통과하다value에 대한 짐으로.GETTING_DATA액션이것은 주에서 가장 최근에 요청된 값을 저장할 것이다. 
그럼, 안으로.getResults같은 값을 반응 데이터와 함께 환원기에 보낸다.환원기 내부, 전달된 값인지 점검하십시오.getResults을 통해 주(州)에 저장된 것과 동일함GETTING_DATA.
그렇다면 이 데이터는 최신 요청에 따라 제공되므로 주(州)에 저장하십시오.그렇지 않으면 그냥 무시해도 된다.
즉, 다음과 같다.
액션:
switch (action.type) {
case GETTING_DATA:
  return {
    ...state,
    lastRequestTime: action.payload,
  };
case SEARCH_DATA:
  if (action.payload.lastRequestTime === state.lastRequestTime) {
    return {
      ...state,
      Results: action.payload.response,
    };
  } else {
    return state
  }
 
액션:
export function getSearch(value) {
  return (dispatch) => {
    const lastRequestTime = Date.now()
    dispatch({
      type: GETTING_DATA, 
      payload: lastRequestTime
    });
    const arg = {
      search: value,
    };
    apiGet('abc', arg).then(response => 
     getResults(dispatch, { response, lastRequestTime }));
  };
}
const getResults = (dispatch, response) => {
  dispatch({
    type: SEARCH_DATA,
    payload: response.data,
  });
};
이렇게 작은 도우미 래퍼를 만들어 이전 요청을 취소해야 하는 곳이라면 어디서든 사용할 수 있다.
// ../services.js
function createApi(baseURL) {
  const axiosInst = axios.create({
    baseURL,
  });
  // here you can set default headers:
  axiosInst.defaults.headers.common['Content-Type'] = 'application/json';
  // return the function with closure variable to use for canceling
  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/') 
 그런 다음 이렇게 아무데나 사용하십시오.
import baseApi from '../servises.js';
const fetchItemsService = baseApi('post');
//...
componentDidMount() {
  fetchItemsService('/items').then(() => {});
}
//... 
 참조URL: https://stackoverflow.com/questions/48122554/cancel-previous-request-live-search-reactjs
반응형
    
    
    
  'programing' 카테고리의 다른 글
| vue 앱에서 다른 앱으로 데이터를 푸시할 수 있는가? (0) | 2022.04.10 | 
|---|---|
| vue 구성 요소에서 vuex를 사용하는 방법? (0) | 2022.04.10 | 
| Vue.js - 마지막 항목 손실 시 요소-ui el-table v-for (0) | 2022.04.09 | 
| UnicodeEncodeError: 'ascII' 코덱이 위치 20에서 문자 u'\xa0'을 인코딩할 수 없음: 서수가 범위(128)에 없음 (0) | 2022.04.09 | 
| 반응 - 소품을 전달하여 입력 defaultValue 변경 (0) | 2022.04.09 |