AngularJS 服务返回数据而不是承诺

AngularJS Service returning data instead of promise

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

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

假设我想打个像$scope.people = myPeopleService.getPeople();这样的电话 在我的服务中想要检查我是否已经有人和 return 那些否则我想做一个 $http.get() 并在我的服务中填充人员然后 return 他们。我不想在我的控制器中使用 .then。这可能吗?

在您的用例中没有 .then 是不可能做到的。因为您想利用 $http 来获取人员并 return 他们(如果他们不在场的话)。 $http 异步工作并且会 return 一个承诺。由于 $http 的异步行为,必须处理调用函数中 returned 的承诺。

希望对您有所帮助!

如果您不想return对您服务的消费者的承诺:

.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. 
      });
  };
});

我的解决方案是 return 对一开始可能为空但最终会保存数据的对象的引用:

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 来保存对象引用。

在controller中你可以使用ng-show直到数据完成,and/or使用watch进行处理

您将无法避免在某个级别、某处此调用是异步的。您的问题的一部分很简单,缓存数据只是 $http 调用中的一个选项:

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

如果您公开来自服务的此调用,则只会通过网络进行一次调用,不需要在您的控制器代码中进行任何更改。uired。

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