البرمجة

استخدام وعود JavaScript داخل دالة map

عندما تحاول استخدام وظيفة الوعد (Promise) داخل دالة الخريطة (map) في جافا سكريبت لإجراء استعلام على قاعدة البيانات لكل عنصر في مصفوفة الكائنات وربط نتائج الاستعلام بكل كائن، يمكن أن تواجهك بعض التحديات. يبدو من الكود الذي قدمته أنك تريد استخدام دالة الوعد داخل دالة الخريطة لكل كائن. ومع ذلك، الكود الحالي لا يقوم بذلك بشكل صحيح، مما يؤدي إلى الحصول على مصفوفة مملوءة بقيم undefined بدلاً من النتائج المتوقعة.

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

إليك كيف يمكن تطبيق هذا الحل باستخدام مكتبة async/await لجعل الشفرة أكثر قراءة وفهماً:

javascript
async function fetchAndAttachData(objects) { // قم بتعريف دالة لاستعلام قاعدة البيانات function queryDatabase(obj) { return new Promise((resolve, reject) => { db.query(obj.id, (err, results) => { if (err) reject(err); else resolve(results); }); }); } // قم بإنشاء مصفوفة لتخزين الوعود المتعلقة بكل كائن const promises = objects.map(obj => queryDatabase(obj)); // انتظر حتى يتم حل جميع الوعود const results = await Promise.all(promises); // قم بربط نتائج الاستعلام بكل كائن objects.forEach((obj, index) => { obj.rows = results[index]; }); // قم بإرجاع المصفوفة المحدثة return objects; } // استخدم الدالة لجلب البيانات وربطها بكل كائن const objectsWithRows = await fetchAndAttachData([obj1, obj2]); console.log(objectsWithRows);

مع هذا الحل، يتم إنشاء وعود لكل عنصر في المصفوفة، ثم يتم استخدام دالة Promise.all() لانتظار حل جميع الوعود قبل ربط نتائج الاستعلام بكل كائن. وبهذا، يمكنك الآن استخدام دالة الخريطة بشكل فعال للقيام بمهام متعددة متزامنة في جافا سكريبت.

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

بالطبع، دعني أكمل المقال بتوضيح بعض النقاط الإضافية والتحسينات التي يمكن إجراؤها في الكود:

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

تم استخدام الكلمة الأساسية async أمام تعريف الدالة fetchAndAttachData لجعلها دالة متزامنة، وذلك لضمان عمل تعليمات await بشكل صحيح داخلها.

كما استخدمنا مفتاح await أمام دالة Promise.all() لضمان انتظار حل جميع الوعود قبل المتابعة في تنفيذ الكود، مما يضمن أن البيانات المسترجعة ستكون متاحة بشكل صحيح للمعالجة.

واستخدمنا دالة forEach لربط نتائج الاستعلام بكل كائن، حيث تم استخدام البيانات المسترجعة results بالترتيب الصحيح مع كل كائن في المصفوفة.

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

علاوة على ذلك، يمكن استكشاف خيارات أخرى لإدارة تدفق البرنامج مثل استخدام مكتبات أخرى مثل async و await لإدارة الوعود بشكل أكثر إتقانًا، أو استخدام مكتبات إضافية مثل bluebird لميزات إضافية وأدوات للتحكم في التدفقات.

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

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

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

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

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