javascript - 在 Angular 中使用 $q 实现,如何循环 promise 直到成功?

标签 javascript angularjs promise q

根据我最近的其他问题,我正在尝试将数据保存到针对移动设备(不稳定连接)的 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/

相关文章:

javascript - 根据文档,在 promise 中抛出错误将拒绝它,但它不会

javascript - 输入回车提交

javascript - 使用 Node.js 读取和写入多个 ip

javascript - 使用 TypeScript 打字的样式化系统 Prop

angularjs - 为什么全局函数在 Angular 1.3 中被认为是 "wrong"

angularjs - 在 Jasmine 测试中获取自定义指令的 Controller 范围

javascript - Angularjs $http.get 调用在页面加载时出现错误

javascript - 如何将数组中的整数相乘?

angularjs - Angular promise 在函数内部而不是在外部解析

javascript - 当一个已经运行时如何处理返回 promise ?