根据我最近的其他问题,我正在尝试将数据保存到针对移动设备(不稳定连接)的 Angular 应用程序的服务器,因此它应该继续尝试请求直到成功。
如何通过 Promise 做到这一点?
目前我有:
服务:
this.addObject = function addObject(object) {
var deferred = $q.defer();
var httpConfig = {
method: 'POST',
url: 'http://api.foo.com/bar',
data: object
}
setTimeout(function() {
$http(httpConfig).
success(function(data, status) {
deferred.resolve('Woohoo!');
}).
error(function(data, status) {
deferred.reject('Couldnt reach server this time...');
});
}, 3000);
return deferred.promise;
}
Controller :
myService.addObject(myObject)
.then(function(message) {
console.log(message);
}, function(message) {
console.log(message);
});
我无法删除拒绝回调,因为如果没有它,代码似乎无法执行,但是一旦调用拒绝,它就会中断 setTimeout 循环。如何强制重复 promise 直到成功回调?
最佳答案
这是 AngularJS service retry when promise is rejected 答案的正确形式
this.addObject = function addObject(object) {
var counter = 0;
var deferred = $q.defer();
var httpConfig = {
method: 'POST',
url: 'http://api.foo.com/bar',
data: object
}
var doRequest = function() {
counter++;
var self = this,args = arguments;
$http(httpConfig).
success(function(data, status) {
deferred.resolve('Woohoo!');
}).
error(function(data, status) {
//just fail already, it's not working
if(counter > 5) {
return deferred.reject('Couldnt reach server this time...');
}
//this will re-call doRequest();
args.callee.apply(self);
});
}
doRequest();
return deferred.promise;
}
关于javascript - 在 Angular 中使用 $q 实现,如何循环 promise 直到成功?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21146856/