我希望能够从角度服务返回预先加载的数据(如果它已经存在),如果不是,我想从Web服务获取数据。
显然,其中一个操作是同步的,另一个不是这样,我想以异步方式包装简单的返回,这样我的控制器中就不需要有很多if ... else块。 / p>
我尝试使用deferred api如下。
worksOrdersApp.factory("WorksOrderService", function ($http, $q) {
var _jobs = [];
var newWorksOrders = function () {
var deferredJobs = $q.defer();
if (_jobs.length === 0) {
return $http.get('/api/WorksOrders/GetNew').success(function(data) {
deferredJobs.resolve(data);
});
} else {
deferredJobs.resolve(_jobs);
}
return deferredJobs.promise;
};
return {
getNewWorksOrders: newWorksOrders,
};
});
然后在我的控制器中,它应该是一个简单的调用...
WorksOrderService.getNewWorksOrders().then(function (data) {
$scope.values = data;
});
这最初似乎有效,服务中data
的值是我期望的数组。但是,当我在调用data
之后检查控制器中deferredJobs.resolve()
的值时,它是一个http响应对象,其中包含状态代码的详细信息以及包含该数组的单独data.data
属性。这仍然意味着我必须在控制器中使用if ... else代码来检查data
是数组还是http响应。
如何将数组传回控制器?
答案 0 :(得分:1)
典型的,一旦我提出问题,我就会发现答案。
在if (_jobs.length === 0)
块中,我返回$http.get
而不是执行它并允许promise返回结果。
这符合我的期望。
if (_jobs.length === 0) {
$http.get('/api/WorksOrders/GetNew').success(function(data) {
_jobs = data; // I also forgot this line, without it _jobs will always be empty and the else block will never execute
deferredJobs.resolve(data);
});
} else {
deferredJobs.resolve(_jobs);
}