angularjs - AngularJS Promise重试

标签 angularjs promise angular-promise angular-resource

我在重试功能正常工作时遇到了一些麻烦,希望能获得一些帮助。我有一个要调用的$ resource,直到出现成功情况或超过最大重试次数为止。

我似乎遇到的问题是,在我的重试函数中,我正在调用另一个promise,这就是检查条件的地方。通过几次重试后,删除添加的promise并创建默认的成功条件,可以使代码正常运行,但是我无法弄清楚如何正确地将新的promise调用添加到函数中。
resource是Angular $ resource的替代品,它返回$ promise

我的代码如下:

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;
 }

最佳答案

尝试的问题在于,您不是在重新查询资源,而是一次又一次地对已查询资源使用Promise。

您需要做的是使用一个函数,该函数将(a)启动查询,并(b)返回该启动查询的promise。像这样的东西:

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

关于angularjs - AngularJS Promise重试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27877626/

相关文章:

javascript - 我怎样才能实现 $ ('input' ).on ('change' , function() AngularJS

javascript - mongodb 更新文档后,返回旧值

使用 node.js 处理 Javascript 异步异常

javascript - 解决 AngularJS 中的多个 Promise

javascript - 异常捕获在功能上与 promise 错误回调相同吗?

javascript - Angular 应用程序出现错误 : TypeError: Cannot read property 'then' of undefined

javascript - 错误: Error: No NgModule metadata found for 'AppComponent'

javascript - Angularjs 和 Intel XDK 不能很好地混合

node.js - 在 nodejs 上循环 redis 返回的 promise

javascript - $q 是否包含 promise 链解析/拒绝时的隐式摘要/应用?