Axios에서 Ajax 요청을 취소/취소하는 방법
사용하고 있다axios
Ajax 요청의 경우reactJS
+flux
렌더링 UI에 사용합니다.내 앱에는 서드파티 타임라인이 있다(리액트).JS 컴포넌트).타임라인은 마우스 스크롤로 관리할 수 있습니다.앱은 스크롤 이벤트 후 실제 데이터에 대한 Ajax 요청을 보냅니다.서버에서의 요청 처리가 다음 스크롤 이벤트보다 더 느릴 수 있다는 문제.이 경우 앱은 사용자가 스크롤을 더 하기 때문에 이미 사용되지 않는 몇 가지 요청(보통 2~3개)을 가질 수 있습니다.새로운 데이터를 수신할 때마다 타임라인이 다시 그려지기 때문에 문제가 됩니다.JS + 플럭스) 이 때문에 사용자는 타임라인의 움직임을 여러 번 볼 수 있습니다.이 문제를 해결하는 가장 쉬운 방법은 다음과 같이 이전 Ajax 요청을 중단하는 것입니다.jQuery
. 예:
$(document).ready(
var xhr;
var fn = function(){
if(xhr && xhr.readyState != 4){
xhr.abort();
}
xhr = $.ajax({
url: 'ajax/progress.ftl',
success: function(data) {
//do something
}
});
};
var interval = setInterval(fn, 500);
);
에서 요청을 취소/중지하는 방법axios
?
Axios는 현재 요청 취소를 지원하지 않습니다.봐주세요자세한 것은, 이 호를 참조해 주세요.
갱신:취소 지원은 액ios v0.15에서 추가되었습니다.
EDIT: 취소 가능한 약속 제안서에 기반한 취소 토큰 API입니다.
UPDATE 2022: v0.22.0 이후 Axios는 AbortController를 지원하여 다음 방법으로 요청을 취소합니다.
예:
const controller = new AbortController();
axios.get('/foo/bar', {
signal: controller.signal
}).then(function(response) {
//...
});
// cancel the request
controller.abort()
useEffect 후크 사용:
useEffect(() => {
const ourRequest = Axios.CancelToken.source() // <-- 1st step
const fetchPost = async () => {
try {
const response = await Axios.get(`endpointURL`, {
cancelToken: ourRequest.token, // <-- 2nd step
})
console.log(response.data)
setPost(response.data)
setIsLoading(false)
} catch (err) {
console.log('There was a problem or request was cancelled.')
}
}
fetchPost()
return () => {
ourRequest.cancel() // <-- 3rd step
}
}, [])
주의: POST 요청의 경우 취소에 합격합니다.세 번째 인수로서의 토큰
Axios.post(`endpointURL`, {data}, {
cancelToken: ourRequest.token, // 2nd step
})
일반적으로 이전 Ajax 요청을 취소하고 해당 인스턴스의 새 Ajax 요청이 시작된 경우에만 다음 작업을 수행합니다.
예: API에서 코멘트를 받습니다.
// declare an ajax request's cancelToken (globally)
let ajaxRequest = null;
function getComments() {
// cancel previous ajax if exists
if (ajaxRequest ) {
ajaxRequest.cancel();
}
// creates a new token for upcomming ajax (overwrite the previous one)
ajaxRequest = axios.CancelToken.source();
return axios.get('/api/get-comments', { cancelToken: ajaxRequest.token }).then((response) => {
console.log(response.data)
}).catch(function(err) {
if (axios.isCancel(err)) {
console.log('Previous request canceled, new request is send', err.message);
} else {
// handle error
}
});
}
import React, { Component } from "react";
import axios from "axios";
const CancelToken = axios.CancelToken;
let cancel;
class Abc extends Component {
componentDidMount() {
this.Api();
}
Api() {
// Cancel previous request
if (cancel !== undefined) {
cancel();
}
axios.post(URL, reqBody, {
cancelToken: new CancelToken(function executor(c) {
cancel = c;
}),
})
.then((response) => {
//responce Body
})
.catch((error) => {
if (axios.isCancel(error)) {
console.log("post Request canceled");
}
});
}
render() {
return <h2>cancel Axios Request</h2>;
}
}
export default Abc;
axios-cancel이라고 하는 사용 예시가 적은 매우 좋은 패키지가 있습니다.나는 그것이 매우 도움이 된다는 것을 알았다.다음은 링크입니다.https://www.npmjs.com/package/axios-cancel
https://github.com/axios/axios#cancellation
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
let url = 'www.url.com'
axios.get(url, {
progress: false,
cancelToken: source.token
})
.then(resp => {
alert('done')
})
setTimeout(() => {
source.cancel('Operation canceled by the user.');
},'1000')
노드에서의 약속을 사용하여 이렇게 했습니다.첫 번째 요청을 한 후 폴링이 중지됩니다.
var axios = require('axios');
var CancelToken = axios.CancelToken;
var cancel;
axios.get('www.url.com',
{
cancelToken: new CancelToken(
function executor(c) {
cancel = c;
})
}
).then((response) =>{
cancel();
})
cp-axios 래퍼를 사용하면 다음 세 가지 유형의 취소 API를 사용하여 요청을 중단할 수 있습니다.
1. Promise cancallation API (CPromise) :
const cpAxios= require('cp-axios');
const url= 'https://run.mocky.io/v3/753aa609-65ae-4109-8f83-9cfe365290f0?mocky-delay=5s';
const chain = cpAxios(url)
.timeout(5000)
.then(response=> {
console.log(`Done: ${JSON.stringify(response.data)}`)
}, err => {
console.warn(`Request failed: ${err}`)
});
setTimeout(() => {
chain.cancel();
}, 500);
2. Abort Controller 신호 API 사용:
const cpAxios= require('cp-axios');
const CPromise= require('c-promise2');
const url= 'https://run.mocky.io/v3/753aa609-65ae-4109-8f83-9cfe365290f0?mocky-delay=5s';
const abortController = new CPromise.AbortController();
const {signal} = abortController;
const chain = cpAxios(url, {signal})
.timeout(5000)
.then(response=> {
console.log(`Done: ${JSON.stringify(response.data)}`)
}, err => {
console.warn(`Request failed: ${err}`)
});
setTimeout(() => {
abortController.abort();
}, 500);
3. 플레인 공리를 사용하여 취소토큰:
const cpAxios= require('cp-axios');
const url= 'https://run.mocky.io/v3/753aa609-65ae-4109-8f83-9cfe365290f0?mocky-delay=5s';
const source = cpAxios.CancelToken.source();
cpAxios(url, {cancelToken: source.token})
.timeout(5000)
.then(response=> {
console.log(`Done: ${JSON.stringify(response.data)}`)
}, err => {
console.warn(`Request failed: ${err}`)
});
setTimeout(() => {
source.cancel();
}, 500);
4. 커스텀 리액트 훅에서의 사용(라이브 데모):
import React from "react";
import { useAsyncEffect } from "use-async-effect2";
import cpAxios from "cp-axios";
/*
Note: the related network request will be aborted as well
Check out your network console
*/
function TestComponent({ url, timeout }) {
const [cancel, done, result, err] = useAsyncEffect(
function* () {
return (yield cpAxios(url).timeout(timeout)).data;
},
{ states: true, deps: [url] }
);
return (
<div>
{done ? (err ? err.toString() : JSON.stringify(result)) : "loading..."}
<button onClick={cancel} disabled={done}>
Cancel async effect (abort request)
</button>
</div>
);
}
갱신하다
는 Axios v0.22.0+를 지원합니다.AbortController
★★★★★★★★★★★★★★★★★★:
const controller = new AbortController();
axios.get('/foo/bar', {
signal: controller.signal
}).then(function(response) {
//...
});
// cancel the request
controller.abort()
v0.22.0 이후 Axios는 AbortController를 지원하여 다음 방법으로 요청을 취소합니다.
const controller = new AbortController();
axios.get('/foo/bar', {
signal: controller.signal
}).then(function(response) {
//...
});
// cancel the request
controller.abort()
CancelToken 권장되지 않음CancelToken을 사용하여 요청을 취소할 수도 있습니다.
악시오 취소 토큰 API는 철회된 취소 가능한 약속 제안을 기반으로 합니다.
이 API는 v0.22.0 이후 사용되지 않으므로 새 프로젝트에서 사용할 수 없습니다.
다음과 같이 CancelToken.source 팩토리를 사용하여 취소 토큰을 작성할 수 있습니다.
import {useState, useEffect} from 'react'
export function useProfileInformation({accessToken}) {
const [profileInfo, setProfileInfo] = useState(null)
useEffect(() => {
const abortController = new AbortController()
window
.fetch('https://api.example.com/v1/me', {
headers: {Authorization: `Bearer ${accessToken}`},
method: 'GET',
mode: 'cors',
signal: abortController.signal,
})
.then(res => res.json())
.then(res => setProfileInfo(res.profileInfo))
return function cancel() {
abortController.abort()
}
}, [accessToken])
return profileInfo
}
// src/app.jsx
import React from 'react'
import {useProfileInformation} from './hooks/useProfileInformation'
export function App({accessToken}) {
try {
const profileInfo = useProfileInformation({accessToken})
if (profileInfo) {
return <h1>Hey, ${profileInfo.name}!</h1>
} else {
return <h1>Loading Profile Information</h1>
}
} catch (err) {
return <h1>Failed to load profile. Error: {err.message}</h1>
}
}
언급URL : https://stackoverflow.com/questions/38329209/how-to-cancel-abort-ajax-request-in-axios
'programing' 카테고리의 다른 글
jss 색상의 불투명도를 변경하는 방법 (0) | 2023.03.14 |
---|---|
Ajax 로딩된 콘텐츠에서 이벤트를 바인드하는 방법 (0) | 2023.03.14 |
같은 도메인에서 CORS 오류가 발생합니까? (0) | 2023.03.14 |
기동 후 스프링 부트 후 모든 엔드포인트 목록을 가져오는 방법 (0) | 2023.03.14 |
ORA-01791: SELECTED 식이 아님 (0) | 2023.03.14 |