我有一个问题,即在AngularJS应用程序中使用服务或工厂。
我想编写一个服务,它将从我可以在我的控制器中使用的Api返回数据。
假设我想要拨打$scope.people = myPeopleService.getPeople();
这样的电话
在我的服务中想要检查我是否已经有人并返回那些我想要做$http.get()
并填写我服务中的人然后返回它们。我不希望在我的控制器中有.then
。这甚至可能吗?
答案 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。
希望这有帮助!