javascript - AngularJS 服务返回预加载的数据或来自 $html.get 的数据

标签 javascript angularjs deferred

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

显然,其中一个操作是同步的,另一个不是,所以我想以异步方式包装简单的返回,这样我的 Controller 中就不必有很多 if...else block 。

我尝试按如下方式使用延迟 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,
    };
});

然后在我的 Controller 中,它应该是一个简单的调用...

 WorksOrderService.getNewWorksOrders().then(function (data) {
     $scope.values = data;
 });

这最初似乎有效,服务中 data 的值是一个数组,正如我所期望的那样。但是,当我在调用 deferredJobs.resolve() 后检查 Controller 中 data 的值时,它是一个包含状态代码详细信息和单独的 的 http 响应对象>data.data 属性包含数组。这仍然意味着我必须在 Controller 中添加 if...else 代码来检查 data 是数组还是 http 响应。

如何将数组传递回我的 Controller ?

最佳答案

典型的是,只要我提出问题,我就会找到答案。

if (_jobs.length === 0) block 中,我返回 $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);
}

关于javascript - AngularJS 服务返回预加载的数据或来自 $html.get 的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19292400/

相关文章:

javascript - JavaScript 中如果没有 .then(),promise 可能会被垃圾回收过早吗?

javascript - 客户端和服务器端 javascript 中 'this' 值的差异

javascript - UI路由器: deal with nested controllers

javascript - 在 ng-repeat 中显示函数结果

jquery - 我缺少什么? jQuery 和 Dojo 中的链接 promise

javascript - 在Javascript中获取Java设置的cookie

angularjs - 使用 Angular 选项卡过滤

javascript - 解析javascript一对多关系查询

jquery - 在 while 循环中延迟

javascript - 我什么时候应该使用 Q.defer 什么时候只使用 Promise.resolve/reject?