반응형
이전 요청 실시간 검색 응답 취소
실시간 검색 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 |