AngularJS服务,从$html.get返回预加载的数据或数据

AngularJS service which returns pre loaded data or data from a $html.get

本文关键字:数据 加载 返回 get 服务 html AngularJS      更新时间:2023-09-26

我希望能够从角度服务返回预加载的数据,如果它已经存在,如果不是,我想从 Web 服务获取数据。

显然,其中一个操作是同步的,另一个不是,所以我想以异步方式包装简单的返回,这样我就不必有很多 if...否则在我的控制器中阻塞。

我尝试使用延迟 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的值是我所期望的数组。但是,当我在调用 deferredJobs.resolve() 后检查控制器中 data 的值时,它是一个 http 响应对象,其中包含状态代码的详细信息和包含数组的单独 data.data 属性。这仍然意味着我必须拥有如果...控制器中的 else 代码,用于检查data是数组还是 HTTP 响应。

如何将数组传回我的控制器?

典型,只要我问问题,我就会发现答案。

if (_jobs.length === 0)块中,我返回$http.get而不是执行它并允许承诺返回结果。

这符合我的预期。

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