我在重试功能正常工作时遇到了一些麻烦,希望能获得一些帮助。我有一个要调用的$ 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/