تقنية

Promise.allSettled: اربط كل نتيجة بطلبها رغم اختلاف وقت الانتهاء

نتائج العينة تحتفظ بترتيب المدخلات.
النتائج تحتفظ بترتيب المدخلات. [2]

ترتيب نتائج allSettled يتبع المدخلات، لا وقت انتهاء الطلبات. [2]

انتظر Promise.allSettled، ثم اقرأ status واربط كل نتيجة بالطلب الذي له الفهرس نفسه في قائمة المدخلات. [1][2]

الخلاصة السريعة

  • تتيح withResolvers إنشاء وعد مع دالتَي resolve وreject للتحكم في عينة الاختبار. [3]
  • تحتفظ allSettled بموضع كل وعد في المدخل، وتنتظر استقرار الوعود كلها. [2]
  • اقرأ value عندما تكون status هي fulfilled، وreason عندما تكون rejected. [1]
  • يعطيك map فهرس النتيجة لتضيف معرف الطلب المقابل من القائمة الثابتة. [2][4]

أنشئ نتائج تتحكم في ترتيبها

تتيح withResolvers إنشاء وعد مع دالتَي resolve وreject للتحكم في عينة الاختبار. [3]

نفّذ المقاطع الثلاثة بالترتيب داخل script من النوع module في صفحة محلية، وافتح وحدة التحكم لرؤية الجدول. تحتاج بيئة تدعم withResolvers. كل استدعاء يعيد promise ودالتين تخصانه؛ نحتفظ بالكائنات الثلاثة كي ننهي الوعود بالترتيب الذي نختاره. أسماء الطلبات تعليمية، ولا تتصل التجربة بخادم أو تقيس سرعة شبكة. [3]

مرّر الشيفرة أفقيًا عند الحاجة.

const a = Promise.withResolvers();
const b = Promise.withResolvers();
const c = Promise.withResolvers();
const jobs = [
  { id: "A", promise: a.promise },
  { id: "B", promise: b.promise },
  { id: "C", promise: c.promise }
];

غيّر ترتيب الاستقرار، لا المدخلات

تحتفظ allSettled بموضع كل وعد في المدخل، وتنتظر استقرار الوعود كلها. [2]

نمرر أ ثم ب ثم ج، وننهي ب ثم ج ثم أ. تبقى النتائج بترتيب المدخلات، مع رفض ب. [2]

لا يعيد التجميع نتيجته النهائية بمجرد رفض ب؛ ينتظر بقية الوعود أيضًا. إذا أبقيت أ معلقًا فلن يصل التنفيذ إلى الجدول. يناسب ذلك متابعة نتائج مهام مستقلة تحتاج معرفة مصيرها جميعًا. [1]

مرّر الشيفرة أفقيًا عند الحاجة.

const pending = Promise.allSettled(jobs.map(job => job.promise));
b.reject("offline");
c.resolve(undefined);
a.resolve(0);
const results = await pending;

افصل الحالة عن محتوى القيمة

اقرأ value عندما تكون status هي fulfilled، وreason عندما تكون rejected. [1]

في المثال، يحقق أ القيمة صفر، ويحقق ج القيمة undefined؛ كلاهما fulfilled. أما ب فهو rejected وسببه النص offline. لذلك لا تختبر صدق value لتقرر نجاح الوعد: قد تكون القيمة الناجحة صفرًا، وقد تكون undefined. افحص الحالة أولًا ثم اقرأ الحقل المناسب؛ كائن النتيجة المرفوضة لا يحمل حقل value. [1]

أضف معرفًا لكل صف

يعطيك map فهرس النتيجة لتضيف معرف الطلب المقابل من القائمة الثابتة. [2][4]

يمرر map الفهرس إلى دالة التحويل، فيتيح قراءة id من jobs وإنشاء صف جديد. لا نكتفي باستدعائه؛ نحفظ المصفوفة التي يعيدها في rows لعرضها. [4]

احتفظ بحقل الحالة في الصف، حتى لا تفقد هذه المعلومة عند جمع نوعَي البيانات تحت اسم واحد. [1]

لا تغيّر jobs بين التجميع والمطابقة؛ فالنتائج لا تضيف معرفات طلباتك تلقائيًا. [2]

مرّر الشيفرة أفقيًا عند الحاجة.

const rows = results.map((result, index) => ({
  id: jobs[index].id,
  status: result.status,
  data: result.status === "fulfilled" ? result.value : result.reason
}));
console.table(rows);

المصادر ومتابعة القراءة

  1. MDN: حالات نتائج allSettled وحقولها (يفتح في نافذة جديدة)developer.mozilla.org
  2. ECMAScript: حفظ الفهرس وانتظار الاستقرار (يفتح في نافذة جديدة)tc39.es
  3. MDN: وعد ودالتا تحققه ورفضه (يفتح في نافذة جديدة)developer.mozilla.org
  4. MDN: التحويل باستخدام map والفهرس (يفتح في نافذة جديدة)developer.mozilla.org

أُعدّ هذا المقال بصياغة عربية أصلية بالاستناد إلى المصادر أعلاه، وهو مدخل تمهيدي إلى الموضوع. اقرأ منهجية المحتوى وحدوده.