AngularJS Service返回数据而不是promise

时间:2015-07-13 13:41:54

标签: javascript angularjs angular-services

我有一个问题,即在AngularJS应用程序中使用服务或工厂。

我想编写一个服务,它将从我可以在我的控制器中使用的Api返回数据。

假设我想要拨打$scope.people = myPeopleService.getPeople();这样的电话 在我的服务中想要检查我是否已经有人并返回那些我想要做$http.get()并填写我服务中的人然后返回它们。我不希望在我的控制器中有.then。这甚至可能吗?

4 个答案:

答案 0 :(得分:2)

如果您不想将承诺退还给您的服务消费者:

.service('...', function ($http) {
  var cachedResponse;

  this.getStuff = function () {
    if (cachedResponse) {
      return cachedResponse;
    }

    return $http.get('someUrl')
      .then(function (response) {
        cachedResponse = response;
        return response; // Return the response of your $http call. 
      });
  };
});

答案 1 :(得分:2)

我的解决方案是返回对最初可能为空的对象的引用,但最终将保存数据:

app.factory('myPeopleService', function($http){

    var people = {};

    $http
        .post( "/api/PeopleService/getInitData", {
        }).success(function (data, status, headers, config) {
            angular.extend(people, data);
        }).error(function (data, status, headers, config) {
        });

    return {
        getPeople: function () {
            return people;
        }
    };
});

关键是使用angular.extend以保留对象引用。

在控制器中,您可以使用ng-show直到数据完成,和/或使用watch进行处理

答案 2 :(得分:1)

你无法在某个层面逃脱,在某个地方,这个调用是异步的。问题的一部分很简单,缓存数据只是$http调用中的一个选项:

$http.get(url, {cache: true})

如果您从服务公开此呼叫,则只会通过网络进行一次呼叫,您的控制器代码不需要进行任何更改。

另一件需要考虑的事情是使用路由器的resolve功能(ui-router和vanilla路由器都支持解析)。这可以清理控制器中的一些代码。

答案 3 :(得分:0)

如果您的用例中没有.then,则无法执行此操作。由于您希望使用$http来获取人员并将其返回(如果他们已经不存在)。 $http异步工作并返回一个promise。由于$http的异步行为,必须处理调用函数中返回的promise。

希望这有帮助!