AngularJS承诺重试
我在使用重试功能时遇到了一些问题,希望得到一些帮助。我有一个$资源,我希望在出现成功条件或超过最大重试次数之前一直调用该资源 我似乎遇到的问题是,在我的重试函数中,我调用了另一个promise,这就是检查条件的地方。我可以通过删除添加的承诺并在几次重试后创建一个默认的成功条件来让代码按预期运行,但我不知道如何正确地将新的承诺调用添加到函数中AngularJS承诺重试,angularjs,promise,angular-promise,angular-resource,Angularjs,Promise,Angular Promise,Angular Resource,我在使用重试功能时遇到了一些问题,希望得到一些帮助。我有一个$资源,我希望在出现成功条件或超过最大重试次数之前一直调用该资源 我似乎遇到的问题是,在我的重试函数中,我调用了另一个promise,这就是检查条件的地方。我可以通过删除添加的承诺并在几次重试后创建一个默认的成功条件来让代码按预期运行,但我不知道如何正确地将新的承诺调用添加到函数中 resource是Angular$resource的替代品,返回$promise 我的代码如下: resource.$promise.then(functi
resource
是Angular$resource的替代品,返回$promise
我的代码如下:
resource.$promise.then(function (response) {
return keepTrying(state, 5);
}).then(function (response) {
}).catch(function (err) {
console.log(err);
});
以及保持干燥功能:
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;
}
您可以实现retryOperation函数,该函数在出现错误时返回一个新的承诺,最大重试次数作为参数传递:
function retryOperation(retryCount) {
var count = 0;
function success(result) {
return result;
}
function error(result) {
++count;
if (count <= retryCount)
return $resource(...).query().$promise.then(success, error);
throw 'max retries reached';
}
return $resource(...).query().$promise.then(success, error);
}
var-app=angular.module('app',[]);
应用控制器('ctrl',函数($q){
函数retryOperation(计数){
var-retryCount=0;
函数操作(){
var deferred=$q.deferred();
延期。拒绝(“失败”);
回报。承诺;
}
功能成功(结果){
返回结果;
}
函数错误(结果){
++复述计数;
if(retryCount您尝试的问题是您没有重新查询资源,而是反复使用已查询资源的承诺
您需要做的是使用一个函数,该函数将(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);
});
}
这种方法的一个优点是,即使您传递给它的函数在调用时抛出错误,或者根本不返回承诺,重试功能和通过已解析的承诺返回结果仍然有效
这没有任何意义。一旦解决或拒绝,承诺的状态将不会改变。调用然后
只会添加一个新的回调。我的理解是,通过添加另一个然后回调并返回承诺,它将等待解决问题,直到承诺得到解决或拒绝,而我正试图在保留期内执行此操作正在尝试函数。我不确定您正在尝试做什么,但请看$q.defer().notify我正在尝试在重试函数中运行新查询,以通过不同的api端点检查原始请求的状态。然后
不会更改基础承诺,它将返回一个新承诺,该承诺将解析为函数的返回值。返回$q不是更好吗。拒绝(错误)不是抛出错误?@JesúsLópezthrow
ing在这种情况下很好,而且更惯用,但是您可能有一点,抛出原始错误比创建新错误并抛出它要好。这样重试逻辑是透明的。retryAction(function(){rmaService.getRma.query({id:rmaId})。$promise},5).then(func…
尝试运行此操作会导致“then”要首先运行的块。有什么方法可以解决此问题吗?rmaService返回$resource@WillyPt您缺少rmaService…
行之前的return
。请参考我的示例,看看那里有一个return
。@JLRishe是的,它现在正在工作。我错过了return,这就是为什么它首先运行的原因。谢谢!
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
});