加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS Promise重试

发布时间:2020-12-17 07:13:57 所属栏目:安全 来源:网络整理
导读:我在尝试重试功能时遇到了一些麻烦,希望得到一些帮助.我有一个我想要调用的$资源,直到成功条件发生或超过最大重试次数. 我似乎遇到的问题是,在我的重试功能中,我正在调用另一个承诺,这就是检查条件的地方.我可以通过删除添加的承诺并在几次重试后创建默认成
我在尝试重试功能时遇到了一些麻烦,希望得到一些帮助.我有一个我想要调用的$资源,直到成功条件发生或超过最大重试次数.

我似乎遇到的问题是,在我的重试功能中,我正在调用另一个承诺,这就是检查条件的地方.我可以通过删除添加的承诺并在几次重试后创建默认成功条件来使代码按预期运行,但我无法弄清楚如何正确地将新的promise调用添加到函数中.

resource是一个返回$promise的Angular $资源的替身

我的代码如下:

resource.$promise.then(function (response) {
  return keepTrying(state,5);
 }).then(function (response) {

 }).catch(function (err) {
   console.log(err);
 });

而keepTrying功能:

function keepTrying(state,maxRetries,deferred) {
  deferred = deferred || $q.defer();
  resource.$promise.then(function (response) {
    success = response;
  });
  if (success) {
    return deferred.resolve(success);
  } else if (maxRetries > 0) {
    setTimeout(function () {
      keepTrying(state,maxRetries - 1,deferred);
     },1000);
   } else if (maxRetries === 0) {
     deferred.reject('Maximum retries exceeded');
   }
   return deferred.promise;
 }

解决方法

您尝试的问题是您不是要重新查询资源,而是一遍又一遍地使用已查询资源的承诺.

您需要做的是使用将(a)启动查询的函数,以及(b)返回该启动查询的承诺.像这样的东西:

function () { return $resource.get().$promise; }

然后你可以将它传递给这样的东西,这将进行重试.

function retryAction(action,numTries) {
    return $q.when()
        .then(action)
        .catch(function (error) {
            if (numTries <= 0) {
                throw error;
            }
            return retryAction(action,numTries - 1);
        });
}

这是你如何开始这个:

retryAction(function () { return $resource.get().$promise; },5)
.then(function (result) {
    // do something with result 
});

关于这种方法的一个好处是,即使你传递给它的函数在调用它时抛出一个错误,或者根本没有返回一个promise,重试功能和通过一个已解决的promise返回结果仍然有效.

Example

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读