در برنامههای مدرن جاوااسکریپت، بهویژه در اپلیکیشنهای تکصفحهای (SPA)، مدیریت درخواستهای HTTP یکی از بخشهای مهم و کلیدی به شمار میرود. یکی از چالشهایی که ممکن است با آن مواجه شوید، لغو درخواستهایی است که دیگر به نتیجه آنها نیاز ندارید. اینجاست که AbortController
وارد میشود.
معرفی AbortController
AbortController
یک API داخلی در جاوااسکریپت است که به شما امکان میدهد تا یک عملیات ناهمگام (مثل fetch
) را به صورت دستی لغو کنید.
ساختار کلی استفاده از AbortController
const controller = new AbortController();
const signal = controller.signal;
fetch("https://api.example.com/data", { signal })
.then(response => response.json())
.then(data => console.log(data))
.catch(error => {
if (error.name === 'AbortError') {
console.log("درخواست لغو شد");
} else {
console.error("خطا در دریافت داده", error);
}
});
// لغو درخواست بعد از ۳ ثانیه
setTimeout(() => controller.abort(), 3000);
موارد استفاده رایج
- لغو درخواست هنگام ترک کامپوننت در React یا Vue
- جلوگیری از ارسال چندین درخواست مشابه پشت سر هم
- لغو درخواستهایی که خیلی طول کشیدهاند
مثال کاربردی در React
useEffect(() => {
const controller = new AbortController();
const signal = controller.signal;
fetch("https://api.example.com/data", { signal })
.then(res => res.json())
.then(data => setData(data))
.catch(err => {
if (err.name !== 'AbortError') {
console.error(err);
}
});
return () => controller.abort();
}, []);
نکات مهم
- فقط برخی از APIها مانند
fetch
ازAbortController
پشتیبانی میکنند. - در مرورگرهای قدیمی ممکن است نیاز به polyfill داشته باشید.
- Axios هم از لغو درخواستها پشتیبانی میکنه — ولی نه دقیقاً با
AbortController
(تا نسخههای جدید).
🔸 نسخههای قدیمی Axios:
از توکنهای لغو (CancelToken) اختصاصی خودش استفاده میکرد:
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/api/data', {
cancelToken: source.token
})
.catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
}
});
// لغو درخواست
source.cancel('درخواست لغو شد');
اما این روش deprecated شده و توصیه نمیشه.
🔸 نسخههای جدید Axios:
از AbortController
پشتیبانی میکنن:
const controller = new AbortController();
axios.get('/api/data', {
signal: controller.signal
})
.catch(function (error) {
if (error.name === 'CanceledError') {
console.log('درخواست لغو شد');
}
});
// لغو درخواست
controller.abort();
🔹 کتابخونههای دیگه:
- fetch: بهصورت پیشفرض از
AbortController
پشتیبانی میکنه. - superagent: روش لغو خودش رو داره (
req.abort()
). - XMLHttpRequest: میتونی
xhr.abort()
بزنی، اما قدیمیه.
- اگه از fetch استفاده میکنی،
AbortController
رو راحت پیاده میکنی. - اگه از Axios نسخه جدید استفاده میکنی، میتونی از
AbortController
استفاده کنی. - بهتره با توجه به نیازت یکی رو انتخاب کنی. برای پروژههای مدرن،
fetch + AbortController
خیلی شیک و سبک هست.
نتیجهگیری
استفاده از AbortController
در کنار fetch
ابزاری بسیار کاربردی برای مدیریت درخواستهای HTTP است، مخصوصاً در شرایطی که باید از ارسال یا ادامه پردازش درخواستهای غیرضروری جلوگیری کرد. این کار هم منابع سیستم را حفظ میکند و هم تجربه کاربری بهتری ارائه میدهد.