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

EKe*_*Ket 19 javascript angularjs

我返回一个带有URL的资源

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

资源回报

["item1"...."item_n",.....,"$promise", "$resolved", "$get", "$save", "$query", "$remove", "$delete"]
Run Code Online (Sandbox Code Playgroud)

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

ray*_*ard 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();
});
Run Code Online (Sandbox Code Playgroud)

  • 未定义的功能. (5认同)
  • 和@chovy和@Tallboy一样的问题.感觉kludgy,但诉诸于`JSON.parse(JSON.stringify(res))`给了一个很好的结果. (3认同)

小智 5

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

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


EKe*_*Ket 2

因此,如果其他人在这里绊倒并且不理解 Promise/AngularJS,这里就是发生的事情。当您使用.then().get()获得承诺和一些辅助函数时,它们都在同一个对象中。这太棒了,因为这样您就不必担心回调的定义以及数据是否可用,因为 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" } );
Run Code Online (Sandbox Code Playgroud)

承诺对象

在此输入图像描述

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

  • 对于我来说,我没有看到“data.data”,当使用 .query() 时,我看到 $promise 和 $resolved 全部混合到同一个对象/数组中..我错过了什么吗?使用 .query() 时循环多个项目的结果会很痛苦 (5认同)
  • 实际上,即使您在最新版本的 Angular 中使用“get().$promise.then()”。它仍然向您发送 $promise 和 $resolve。所以你需要使用data.toJSON()。当然,这是在您的服务器使用 REST 的情况下 (2认同)