为什么angular $ resource会为我的数据响应添加额外的对象($ promise,$ resolve ...)?

时间:2014-03-21 00:51:57

标签: javascript angularjs

我返回一个带有网址的资源

    $resource("http://foo.com/bar.json").get().
         $promise.then(function(data){ $scope.result = data}, 
                  function(error){ $scope.msg = "error" } );

资源回报

["item1"...."item_n",.....,"$promise", "$resolved", "$get", "$save", "$query", "$remove", "$delete"]

为什么我会在数据集中获取所有这些对象。我猜$ promise只返回所有这些并等待服务器响应。但是,一旦我有服务器响应,我可以在没有Promise术语的情况下获取我的服务器数据吗?

5 个答案:

答案 0 :(得分:33)

如果你在这里看一下角度来源:

https://github.com/angular/angular.js/blob/master/src/ngResource/resource.js#L505

资源原型链上有一个toJSON方法,可以为您完成此任务。

例如:

$resource("http://foo.com/bar.json").get(function(res) {
    $scope.result = res.toJSON();
});

答案 1 :(得分:5)

您需要从后端返回包含{{result':{'some_key':'some_val'}}的结果。 或者就像上面描述的那样。

Diary.getSharedWithMe(function(data) {
        delete data.$promise;
        delete data.$resolved;
        _self.sharedDiariesWithMe = data;
    }, function(error) {
        console.log(error)
    });

答案 2 :(得分:4)

$resource返回一个对象或数组,它将在调用完成时拥有您的数据。所有这些功能都可以帮助您,$resource主要用于CRUD操作。如果你想要数据,你必须等待它返回,所以你也可以使用诺言。如果要删除所有这些属性,可以使用angular.toJson将其转换为json,但在将其发布回资源或$ http调用时,angular会为您执行此操作,因此您不必这样做。

$scope.data = $resource("http://foo.com/bar.json").get();
// $scope.data does not have your data yet, it will be
// populated with your data when the AJAX call completes
...
// later in a call from a save button maybe you can just do
// this to post your changes back:
$scope.data.$save();

答案 3 :(得分:2)

所以,如果其他人在这里磕磕绊绊,并且不了解承诺/角度,这就是正在发生的事情。当您使用.then().get()时,您会在同一个对象中获得一个promise和一些帮助函数。这很棒,因为您不必担心定义回调以及数据是否可用,因为promise对象总是有一些属性。此对象包含您在其中的另一个对象中的原始数据。所以promise对象是嵌套的,你只需要在数据就绪时引用数据对象。

这是我正在做的事情

     $resource("http://foo.com/bar.json").get().
         $promise.then(function(data){ $scope.result = data}, 
//data is actually a promise object.
                  function(error){ $scope.msg = "error" } );

承诺对象

enter image description here

请注意,数据实际上位于另一个名为" data"的对象下。因此,在您的成功回调中,只需获取您应该在这种情况下执行的数据:data.data

答案 4 :(得分:0)

要从每个请求中自动删除它们,您可以添加拦截器:

angular.module('app').config(config);

config.$inject = ['$httpProvider'];
function config($httpProvider) {
    $httpProvider.interceptors.push(interceptor);
}

interceptor.$inject = [];
function interceptor() {
    return {
        request: (config) => {
            if (config.data) {
                delete config.data.$promise;
                delete config.data.$resolved;
            }
            return config;
        }
    };
}