AngularJS使用$ resource服务。 GET请求无法解决承诺

时间:2013-11-15 18:38:16

标签: json angularjs

我们假设这样的服务:

   services.factory('User', function($resource){
        return $resource('/rest/usersettings/:username', {}, {
            get:    {method: 'GET'},
            update: {method: 'POST'}
        });
    });

所以它应该像这样使用:

        scope.user = User.get( {username: 'bob'}  );    // GET

        console.log( JSON.stringify(scope.user) )       // {"$promise":{},"$resolved":false} 

所以,当我发送GET请求时,它就可以了,构建这个ur + params:

http://localhost:9000/rest/usersettings/bob

问题,为什么我有: {"$promise":{},"$resolved":false}

如果我的GET请求导致服务器返回json-response:{"username":"bob","email":"bob@bobs.com"}那么我希望我的scope.user填充数据。

我应该以某种方式等待承诺准备/解决?

4 个答案:

答案 0 :(得分:60)

User.get( {username: 'bob'} )不会立即返回您的实际数据。当ajax返回时,它返回一些将保存数据的东西。在那个($promise)上,您可以注册一个额外的回调来记录您的数据。

您可以将代码更改为:

   scope.user = User.get( {username: 'bob'}  );    // GET
   scope.user.$promise.then(function(data) {
       console.log(data);
   });

答案 1 :(得分:12)

您将获得数据,但不会立即获得。 阅读docs on ngResource

  

重要的是要意识到调用$ resource对象方法   立即返回一个空引用(对象或数组取决于   IsArray的)。一旦数据从服务器返回现有数据   引用填充了实际数据。这是一个有用的技巧   因为通常将资源分配给当时的模型   由视图呈现。拥有一个空对象导致无法渲染,   一旦数据从服务器到达,则填充对象   随着数据和视图自动重新呈现自己显示   新数据。这意味着在大多数情况下,人们永远不必写一个   动作方法的回调函数。

答案 2 :(得分:3)

现在我用它(似乎我复制this问题)

User.get({
    username: 'bob'
}, function(user) {

    user.$update(
        function(data, headers) {
            console.log("GOOD");
        },
        function(err, headers) {
            console.log("BAD");
        }
    );
});

答案 3 :(得分:2)

这应该有效:

User.get( {username: 'bob'} ).$promise.then(function(data) {
    scope.user = data.toJSON();
});

toJSON()清除Angular的内部属性($$)。