Angular.js resourceProvider返回带有数据的$ promise

Gle*_*ift 3 javascript rest resourceproviderfactory angularjs angular-services

给出angular.js服务:

angular.module('mymodule').factory('Products', ['$resource',
    function($resource) {
        return $resource('/path/to/getProducts', {}, {
            find: {
                method: 'GET',
                isArray: false
            }
        });
    }
]);
Run Code Online (Sandbox Code Playgroud)

mymodule我的控制器中find查询:

$scope.findAll = function () {
    Products.find(function (products) {
        console.log(Object.keys(products));
        // ['prodA', 'prodB', ... , '$promise', '$resolved']
        for (var i in products) {
            if (!products.hasOwnProperty(i)) continue;
            console.log(products[i].description.someprop);
            // Got error: Cannot read property 'someprop' of undefined
            // Trust me: I debug this place. someprop is defined for all items except that two
        }
    });
};
Run Code Online (Sandbox Code Playgroud)

它工作正常,但返回$ promise和$使用数据集解析,因此我无法遍历我的数据.

角单证Resource情况和收集有这些附加属性.但我不明白如何在我的代码中控制它.

我究竟做错了什么?怎么预防呢?

deo*_*lem 8

实际上,当你不使用数组时会有点复杂.

response从服务器发回的对象包含:

  • resource对象(数据+ $promise$resolved,这就是你在你的回调得到)
  • 一个config对象(标题,使用的方法,调用的URL等)和一个headers函数
  • 和一个data对象,这就是我们想要的!它只包含数据.

但你只能看到response.resource你的then().因此,您需要拦截服务器发送的响应以获取数据:

return $resource('/path/to/getProducts', {}, {
        find: {
           method: 'GET',
           isArray: false,
           interceptor: {
             response: function(response) {  
               return response.data;
             }
           }
        }
    });
Run Code Online (Sandbox Code Playgroud)

然后在你的控制器中:

Products.find().$promise.then(
    function(products){
        angular.forEach(products, function(value, index){
            console.log(value);
        });
    }
);
Run Code Online (Sandbox Code Playgroud)

告诉我这是否适合你.

Plunker演示

  • 别客气.我也学到了一些东西! (2认同)