【问题标题】:AngularJS using $resource service. Promise is not resolved by GET requestAngularJS 使用 $resource 服务。 GET 请求未解决 Promise
【发布时间】:2013-11-15 18:38:15
【问题描述】:

假设这样的服务:

   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 + 参数:

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

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

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

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

【问题讨论】:

标签: json angularjs


【解决方案1】:

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

您可以将代码更改为:

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

【讨论】:

  • 如果遵循这个,那么我有:'TypeError: Cannot call method 'then' of undefined' 我想我应该注入 $promise ..
  • 不,$promise 不是服务。它应该是scope.user 的属性。你确定你没有错别字?现在无法重现它,但我看到 $promise 是在您的原始代码中定义的({"$promise":{},"$resolved":false} 字符串化时)
  • 我想您在此期间没有切换 Angular 版本。 $resource 有一个重大变化。 1.2.x 为 scope.user.$promise.then(),1.0.x 为 scope.user.$then()
  • 对我不起作用:我仍然得到两个对象以及数据。对象 { 1421589556:真,$promise:对象,$resolved:真}。我希望只有第一个条目。
  • @harry,这不正确吗?您可以看到已解决:true。它是一个长度为 1 的数组(或类似数组的 obj)。如果您使用 chrome 控制台,您将看到它的所有属性。 $promise 和 $resolved 属性应该是不可枚举的属性,因此在您的控制器中,如果您指定“数据集中的数据”,则可以保证这两个属性不会被枚举。
【解决方案2】:

您将在其中获取数据,但不会立即获取。 阅读docs on ngResource

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

【讨论】:

  • 我明白了。我刚刚从工作代码中得到了那段代码。尝试在本地隔离环境中体验它。因此,这意味着即使它在那里“工作”,它也可能有一天会停止工作。
  • 这将永远停止工作,除非您升级到某些未来的 Angular 版本,该版本在资源返回上有重大变化(非常不可能)。
  • 这意味着它永远不会缓存任何东西,因为它总是等待数据“从服务器返回”。如果我把它放在一个表达式中,将会有一个无限的摘要循环,因为它不断地从没有数据到有数据......
【解决方案3】:

现在我用这个(似乎我重复了this问题)

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

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

【讨论】:

    【解决方案4】:

    这应该可行:

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

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

    【讨论】:

    • 虽然这可能是一个解决方案,但仅代码的答案被认为是低质量的。请添加一些解释。
    • 不知道接受结果的版本,但在 Angular 1.5 中这是正确答案。 $promise 不属于scope.user 而是属于工厂的User.get() 函数。
    猜你喜欢
    • 2015-07-09
    • 1970-01-01
    • 2013-09-30
    • 2016-08-02
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    相关资源
    最近更新 更多