البرمجة

حل مشكلة تمرير المعاملات في وعود JavaScript

عندما تقوم بإستخدام دالة setTimeout مع الوعد (Promise)، يبدو أن الوضع يختلف قليلاً عندما يتعلق الأمر بتمرير العديد من الوسائط إلى الدالة المستدعاة عند حل الوعد. في الواقع، يبدو أن تلك الطريقة لا تعمل كما هو متوقع عند استخدام Promise.all.

عندما تقوم بتمرير الوسائط لدالة setTimeout داخل الوعد، يبدو أنه يتم تجاهل الوسائط بعد الأولى. والسبب في ذلك يعود إلى كيفية عمل دالة setTimeout بشكل عام، حيث يُفضل تمرير معاملات واحدة فقط للدالة التي تقوم بتأجيل تنفيذها.

لحل هذه المشكلة وجدتني أفكر في استخدام دالة فرعية للتعامل مع هذا الموضوع. يمكننا استخدام دالة فرعية لتجميع المعاملات ثم تمريرها إلى الوظيفة التي نريد تأجيل تنفيذها. لنقم بتطبيق هذا الحل:

var p1 = new Promise((resolve, reject) => {
  const params = [1, 2, 3];
  setTimeout(() => resolve(params), 200);
});
var p2 = new Promise((resolve, reject) => {
  setTimeout(() => resolve("two"), 500);
});

Promise.all([p1, p2]).then(values => {
  const flattenedValues = values.flat(); // لتسطيح القيم المتعددة إلى مصفوفة واحدة
  console.log(flattenedValues);
}, reason => {
  console.log(reason);
});

بهذا التغيير، سيتم تمرير المعاملات كمصفوفة واحدة إلى دالة setTimeout داخل الوعد، وبالتالي ستعمل بشكل صحيح مع Promise.all وستحصل على النتيجة المتوقعة.

المزيد من المعلومات

بالتأكيد، سنقوم الآن بمواصلة تطوير المقال.

عند تحليل الحلول الممكنة لهذه المشكلة، نجد أن استخدام دالة فرعية لتجميع المعاملات وتمريرها إلى setTimeout داخل الوعد هو الحلا الأمثل. هذا الحل لا يفقد أي من مرونة دوال الوعد ولا يتطلب تغييرات كبيرة في الشفرة المصدرية.

ومن المهم أن نفهم كيف يعمل هذا الحل الجديد. بدلاً من تمرير المعاملات بشكل فردي إلى دالة setTimeout داخل كل وعد، نقوم بتجميع المعاملات في مصفوفة واحدة داخل دالة فرعية، ثم نقوم بتمرير هذه المصفوفة كمعامل واحد لدالة setTimeout. هذا يضمن أن جميع المعاملات المطلوبة ستتمرر بشكل صحيح للدالة التي تنتظر التنفيذ.

من الجدير بالذكر أن استخدام دالة flat() لتسطيح المصفوفات في الوعد الناتج من Promise.all يعمل بشكل مثالي لتجميع القيم في مصفوفة واحدة. هذا يجعل عملية التعامل مع البيانات أكثر سهولة وسلاسة.

وبهذا، نكون قد وصلنا إلى حلاً مرضيًا لهذه المشكلة، والذي يحافظ على سلاسة الشفرة ومرونة الوعد في JavaScript. تظهر هذه المشكلة بوضوح كيف يمكن للتفاصيل الصغيرة في تفاصيل اللغة أن تؤثر بشكل كبير على سير العمل في بيئات البرمجة المعقدة. ومن خلال فهم العمليات الداخلية للوعود ودوال JavaScript الأساسية، يمكننا العثور على حلول بديلة ذكية للتغلب على تلك التحديات.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر