"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيفية ضمان التنفيذ المتزامن للتعليمات البرمجية المستندة إلى الوعد في حلقة؟

كيفية ضمان التنفيذ المتزامن للتعليمات البرمجية المستندة إلى الوعد في حلقة؟

تم النشر بتاريخ 2024-11-04
تصفح:234

How to Ensure Synchronous Execution of Promise-Based Code in a Loop?

العثور على بنية الحلقة الصحيحة لضمان تشغيل التعليمات البرمجية المستندة إلى الوعد بشكل متزامن

عند العمل مع التعليمات البرمجية المستندة إلى الوعد، فإن بنية الحلقة الصحيحة هي ضروري لضمان التنفيذ المتزامن للعمليات غير المتزامنة. في السيناريو المحدد، الهدف هو إنشاء حلقة تضمن تنفيذ "db.getUser(email).then(function(res) { logger.log(res); })" بالترتيب الصحيح أثناء كل تكرار.

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

الوعود المتوازية مقابل الوعود التسلسلية

تكمن المشكلة في متطلب الحفاظ على ترتيب الاستجابات، مما يلغي استخدام النهج المتوازي عبر Array.prototype.map(). لبناء سلسلة الوعد المرغوبة بترتيب محفوظ، يعتبر Array.prototype.reduce() أكثر ملاءمة.

مثال:

function fetchUserDetails(arr) {
    return arr.reduce(function(promise, email) {
        return promise.then(function() {
            return db.getUser(email).done(function(res) {
                logger.log(res);
            });
        });
    }, Promise.resolve());
}

باستخدام هذه الطريقة، يتم ضمان أن يكون تنفيذ استدعاءات "db.getUser" تسلسليًا، مما يضمن الحفاظ على ترتيب النتائج. يمكن استدعاء الكود كما يلي:

var arrayOfEmailAddys = [...];

fetchUserDetails(arrayOfEmailAddys).then(function() {
    console.log('all done');
});

هذا النهج يلغي الحاجة إلى حلقات أو شروط معقدة ويضمن التنفيذ السليم لسلسلة الوعد، حتى عند التعامل مع العمليات غير المتزامنة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3