الخطأغير مكتشف (في الوعد) في وحدة تحكم المتصفح الخاص بك يعني أنه تم رفض الوعد ولكن لم يعالج أي شيء الرفض. غالبًا ما يظهر مع رسالة خطأ فعلية ويشير إلى حالات فشل غير متزامنة لم تتم معالجتها. وإليك كيفية إصلاح كل متغير.
📋 Table of Contents
- ماذا يعني هذا الخطأ
- السبب 1: مفقود .catch() في سلسلة الوعد
- السبب 2: غير متزامن/انتظار بدون محاولة/التقاط
- السبب 3: استدعاء وظيفة غير متزامنة دون معالجة رفضها
- السبب 4: نسيان العودة/الانتظار في سلسلة
- السبب 5: معالجات الأحداث مع عمليات الاسترجاعات غير المتزامنة
- المعالج العالمي (شبكة الأمان)
- Promise.all ومعالجة الأخطاء
- الأسئلة المتداولة
- الخلاصة
ماذا يعني هذا الخطأ
عندما يرفض (يفشل) وعد ما، يجب عليك التعامل معه باستخدام.catch() أو محاولة/التقاط (مع غير متزامن/انتظار). إذا لم تقم بذلك، فستبلغ JavaScript “لم يتم اكتشافه (في الوعد)” – حدث خطأ غير متزامن بدون معالج. على عكس الأخطاء المتزامنة، لا تؤدي حالات رفض الوعد غير المعالجة إلى تعطل الصفحة ولكنها تشير إلى وجود خطأ.
السبب 1: مفقود .catch() في سلسلة الوعد
// 🐛 No .catch() — if fetch fails, rejection is unhandled
fetch('/api/data')
.then(res => res.json())
.then(data => console.log(data));
// Missing .catch() → "Uncaught (in promise)" if it fails
// ✅ Always add .catch()
fetch('/api/data')
.then(res => res.json())
.then(data => console.log(data))
.catch(err => console.error('Fetch failed:', err));
السبب 2: غير متزامن/انتظار بدون محاولة/التقاط
// 🐛 await can reject, and there's no try/catch
async function loadData() {
const res = await fetch('/api/data'); // rejects if network fails
const data = await res.json();
return data;
}
loadData(); // "Uncaught (in promise)" if fetch rejects
// ✅ Wrap in try/catch
async function loadData() {
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return await res.json();
} catch (err) {
console.error('Load failed:', err);
return null;
}
}
السبب 3: استدعاء وظيفة غير متزامنة دون معالجة رفضها
// 🐛 async function rejects, caller doesn't handle it
async function saveData() {
throw new Error('Save failed');
}
saveData(); // "Uncaught (in promise): Error: Save failed"
// ✅ Handle at the call site
saveData().catch(err => console.error(err));
// ✅ Or in an async context
async function main() {
try {
await saveData();
} catch (err) {
console.error(err);
}
}
السبب 4: نسيان العودة/الانتظار في سلسلة
// 🐛 Nested promise not returned — its rejection escapes the chain
function process() {
return fetch('/api/step1')
.then(res => {
fetch('/api/step2'); // ❌ not returned — rejection unhandled
});
}
// ✅ Return the inner promise so the chain handles it
function process() {
return fetch('/api/step1')
.then(res => {
return fetch('/api/step2'); // returned — chain catches its errors
})
.catch(err => console.error(err));
}
السبب 5: معالجات الأحداث مع عمليات الاسترجاعات غير المتزامنة
// 🐛 async event handler with no error handling
button.addEventListener('click', async () => {
const data = await fetchData(); // if this rejects, unhandled
render(data);
});
// ✅ Handle errors inside the async handler
button.addEventListener('click', async () => {
try {
const data = await fetchData();
render(data);
} catch (err) {
showError('Could not load data');
console.error(err);
}
});
المعالج العالمي (شبكة الأمان)
// Catch any unhandled rejections globally (last resort, not a fix)
window.addEventListener('unhandledrejection', (event) => {
console.error('Unhandled rejection:', event.reason);
event.preventDefault(); // prevents the default console error
// Log to your error tracking service
reportError(event.reason);
});
// In Node.js:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection:', reason);
// In production, log and possibly exit gracefully
});
Promise.all ومعالجة الأخطاء
// 🐛 Promise.all rejects if ANY promise rejects — needs a catch
const results = await Promise.all([fetchA(), fetchB(), fetchC()]);
// If fetchB rejects, the whole thing rejects — handle it
// ✅ With try/catch
try {
const results = await Promise.all([fetchA(), fetchB(), fetchC()]);
} catch (err) {
console.error('One of the requests failed:', err);
}
// ✅ Or use allSettled to get all results regardless of failures
const results = await Promise.allSettled([fetchA(), fetchB(), fetchC()]);
results.forEach(r => {
if (r.status === 'fulfilled') use(r.value);
else console.error('Failed:', r.reason);
});
الأسئلة المتداولة
س: هل يؤدي الرفض غير المعالج إلى تعطل تطبيقي؟
ج: في المتصفحات، لا – تستمر الصفحة في العمل، ولكنك تحصل على خطأ وحدة التحكم ولم تكتمل العملية الفاشلة بصمت. في Node.js، يمكن أن تؤدي حالات الرفض غير المعالجة إلى تعطيل العملية (في الإصدارات الحديثة). وفي كلتا الحالتين، إنه خطأ يجب إصلاحه، وليس تجاهله.
س: أين أضع .catch() بالضبط؟
ج: في نهاية سلسلة الوعد، يتم اكتشاف الأخطاء من أي خطوة سابقة. باستخدام غير المتزامن/الانتظار، يمكنك تغليف المكالمات المنتظرة بمحاولة/التقاط. المفتاح هو أن كل عملية غير متزامنة لها معالج في مكان ما.
س: هل يعتبر معالج الرفض العالمي غير المعالج حلاً مناسبًا؟
ج: لا — إنها شبكة أمان للتسجيل، وليست بديلاً لمعالجة الأخطاء عند حدوثها. استخدمه لالتقاط أي شيء فاتك والإبلاغ عنه، ولكن قم بإصلاح حالات الرفض الفعلية التي لم تتم معالجتها من مصدرها.
س: لماذا يعمل في بعض الأحيان دون الآخرين؟
ج: يحدث الرفض فقط عندما يفشل الوعد فعليًا (خطأ في الشبكة، خطأ HTTP، استثناء تم طرحه). إنه يعمل عندما ينجح كل شيء، ولا يخطئ إلا عندما يفشل شيء ما – وهذا بالضبط عندما تحتاج إلى معالجة الأخطاء المفقودة.
س: هل يجب علي استخدام .catch() أو محاولة/catch؟
ج: استخدم محاولة/التقاط مع غير متزامن/انتظار (منظف، يقرأ من الأعلى إلى الأسفل). استخدم .catch() مع سلاسل الوعد (.then). يتعامل كلاهما مع حالات الرفض — اختر بناءً على النمط الذي تستخدمه. لا تخلطهم بشكل محرج في نفس الوظيفة.
الخلاصة
“لم يتم اكتشافه (في الوعد)” يعني فشل عملية غير متزامنة مع عدم وجود معالج للأخطاء. الإصلاح دائمًا هو معالجة الرفض:إضافة.catch() لوعد السلاسل، لفawait استدعاءات المحاولة/الالتقاط، والتعامل مع حالات الرفض في موقع الاتصال الخاص بالوظائف غير المتزامنة. إضافةunhandledrejectionعمومي المعالج كشبكة أمان للتسجيل، ولكن قم بإصلاح حالات الرفض الفعلية غير المعالجة من مصدرها. يجب أن تحتوي كل عملية غير متزامنة في التعليمات البرمجية الخاصة بك على معالجة للأخطاء في مكان ما – وهذه هي الطريقة الموثوقة للتخلص من هذه الأخطاء وإنشاء تطبيقات قوية.
🔗 Share this article
✍️ Leave a Comment