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

كيف تنفذ أنماط تصميم إعادة إعادة محاكاة الوعد لمعالجة الأخطاء العابرة؟

نشر في 2025-03-23
تصفح:156

How to Implement Promise Retry Design Patterns for Transient Error Handling?

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

إرجاع وعد جديد (وظيفة (حل ، رفض) { خطأ فار. var try = function () { إذا (الأوقات == 0) { رفض (خطأ) ؛ } آخر { fn (). ثم (حل) .catch (وظيفة (e) { مرات-؛ خطأ = هـ ؛ setTimeOut (function () {try ()} ، delay) ؛ }) ؛ } } ؛ محاولة()؛ }) ؛ } ؛

نمط #2: إعادة المحاولة حتى تلتقي الحالة

إنه يحدد تأخيرًا بين إعادة المحاكاة وعدد أقصى للمحاولات.

work.publish () .Then (الوظيفة (النتيجة) { إرجاع وعد جديد (وظيفة (حل ، رفض) { var intervalid = setInterval (function () { work.requeststatus (النتيجة). التبديل (result2.status) { حالة "التقدم": استراحة ؛ // لا تفعل شيئًا حالة "النجاح": ClearInterval (الفاصل) ؛ حل (النتيجة 2) ؛ استراحة؛ حالة "الفشل": ClearInterval (الفاصل) ؛ رفض (النتيجة 2) ؛ استراحة؛ } }). } ، 1000) ؛ }) ؛ }) .Then (function () {console.log ('done')}) .catch (console.error) ؛

نمط #3: إعادة إعادة محاكمة غير محدودة مع الحالة
Promise.retry = function(fn, times, delay) {
    return new Promise(function(resolve, reject){
        var error;
        var attempt = function() {
            if (times == 0) {
                reject(error);
            } else {
                fn().then(resolve)
                    .catch(function(e){
                        times--;
                        error = e;
                        setTimeout(function(){attempt()}, delay);
                    });
            }
        };
        attempt();
    });
};

إرجاع وعد جديد (وظيفة (حل ، رفض) { setTimeout (refect.bind (null ، wise) ، t) ؛ }) ؛ } var p = promise.reject () ؛ لـ (var i = 0 ؛ i

أعد إعادة المحاولة حتى يجتمع الشرط ، لا تأخير
work.publish()
    .then(function(result){
        return new Promise(function(resolve, reject){
            var intervalId = setInterval(function(){
                work.requestStatus(result).then(function(result2){
                    switch(result2.status) {
                        case "progress": break; //do nothing
                        case "success": clearInterval(intervalId); resolve(result2); break;
                        case "failure": clearInterval(intervalId); reject(result2); break;
                    }
                }).catch(function(error){clearInterval(intervalId); reject(error)});
            }, 1000);
        });
    })
    .then(function(){console.log('done')})
    .catch(console.error);

var max = 5 ؛ var p = promise.reject () ؛ لـ (var i = 0 ؛ i

أعد إعادة المحاولة حتى يجتمع الشرط ، مع التأخير

var max = 5 ؛ var p = promise.reject () ؛ لـ (var i = 0 ؛ i

الاستنتاج

function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}

بيان الافراج يتم استنساخ هذه المقالة في: 1729587561 إذا كان هناك أي انتهاك ، فيرجى الاتصال بـ [email protected] لحذفه.
أحدث البرنامج التعليمي أكثر>

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

Copyright© 2022 湘ICP备2022001581号-3