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-路由器和普通路由器都支持解析)。这可以清理控制器中的一些代码。
我有一个关于在 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-路由器和普通路由器都支持解析)。这可以清理控制器中的一些代码。