首页 > web前端 > js教程 > 正文

如何实现用于瞬态错误处理的 Promise 重试设计模式?

Susan Sarandon
发布: 2024-10-22 22:57:29
原创
478 人浏览过

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

Promise 重试设计模式

简介

当异步操作失败时,重试可以是处理瞬态错误的有效策略。本文介绍了重试基于 Promise 的操作的各种模式,重点关注三种常见场景。

模式#1:重试直到 Promise 解决

此模式不断重试 Promise直至成功解决。它指定重试之间的延迟和最大尝试次数。

<code class="javascript">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();
    });
};</code>
登录后复制

模式#2:重试直到满足条件

此模式重试直到满足条件关于承诺的结果。它指定重试之间的延迟和最大尝试次数。

<code class="javascript">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);</code>
登录后复制

模式#3:带条件的无限重试

此模式提供了一种节省内存的方法重试无限次。它仅指定重试之间的延迟。

使用 .catch() 链的替代方法

与上面的模式不同,此方法构建一个 .catch() 链,而不是.then() 链。它限制了尝试次数,适合低最大值场景,以避免过多的内存消耗。

<code class="javascript">function rejectDelay(reason) {
    return new Promise(function(resolve, reject) {
        setTimeout(reject.bind(null, reason), t); 
    });
}</code>
登录后复制

重试直到解决,有延迟

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>
登录后复制

重试直到条件满足,无延迟

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test);
}

p = p.then(processResult).catch(errorHandler);</code>
登录后复制

重试直到条件满足,有延迟

<code class="javascript">var max = 5;
var p = Promise.reject();

for(var i=0; i<max; i++) {
    p = p.catch(attempt).then(test).catch(rejectDelay);
}

p = p.then(processResult).catch(errorHandler);</code>
登录后复制

结论

这些模式提供了多种方法来实现异步操作的重试逻辑。使用 .catch() 还是 .then() 链取决于需求,例如内存使用情况和最大尝试次数。

以上是如何实现用于瞬态错误处理的 Promise 重试设计模式?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!