一尘不染

当承诺被拒绝时,AngularJS服务重试

angularjs

我从控制器内部的异步服务获取数据,如下所示:

myApp.controller('myController', ['$scope', 'AsyncService',
function($scope, AsyncService) {
    $scope.getData = function(query) {
        return AsyncService.query(query).then(function(response) {
            // Got success response, return promise
            return response;
        }, function(reason) {
            // Got error, query again in one second
            // ???
        });
    }
}]);

我的问题:

  1. 当我从服务中获得错误而又不返回承诺时,如何再次查询服务。
  2. 在我的服务中这样做会更好吗?

谢谢!


阅读 191

收藏
2020-07-04

共1个答案

一尘不染

您可以在服务本身而不是控制器中重试该请求。

因此,AsyncService.query可能是这样的:

AsyncService.query = function() {
  var counter = 0
  var queryResults = $q.defer()

  function doQuery() {
    $http({method: 'GET', url: 'https://example.com'})
      .success(function(body) {
        queryResults.resolve(body)
      })
      .error(function() {
        if (counter < 3) {
          doQuery()
          counter++ 
        }
      })
  }

  return queryResults.promise
}

您可以摆脱控制器中的错误功能:

myApp.controller('myController', ['$scope', 'AsyncService',
  function($scope, AsyncService) {
    $scope.getData = function(query) {
      return AsyncService.query(query).then(function(response) {
        // Got success response
        return response;
      });
    }
  }
]);
2020-07-04