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

如何实现 Promise Retry 设计模式以实现高效的错误处理?

Patricia Arquette
发布: 2024-10-22 19:01:21
原创
313 人浏览过

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

Promise 重试设计模式:一种节省内存的方法

使用 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.重试直到满足结果条件

此模式会重试,直到 Promise 结果满足指定条件。它还包括最大重试次数和尝试之间的延迟。

<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.内存高效的动态重试

此模式使用递归方法,提供具有可配置延迟的无限重试。

<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() 链,此模式允许用于简洁的重试实现,特别是在最大重试次数较低或同步测试的场景中。

这些模式中的每一种都为重试 Promise 操作提供了灵活高效的解决方案。根据您的应用要求,您可以选择最适合您需求的模式。

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

来源:php
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板