从$ resource.get(...)。$ promise中提取数据

时间:2015-01-03 17:12:42

标签: angularjs angular-resource

我使用$ resource从Facebook的图表API获取数据:

resource = $resource(
    "https://graph.facebook.com/v2.2/:api/:id/:node/"
)

例如,我向' https://graph.facebook.com/v2.2/user.id/albums/'提出了成功的请求。由:

resource.get({id:user_id, node: "albums", access_token: ....}).then(function(response)
{
    console.log(response)
})

并且响应显示(在Chrome开发工具控制台中):

Resource
- $promise: Promise
- $resolved: true
- data: Array[9] 
    - 0: Object
    - 1: Object2:
    - length: 9
    - __proto__: Array[0]
- paging: Object
- __proto__: Resource

所以我天真地尝试添加console.log response另一个console.log response.data

但它显示未定义'。

所以我想知道如何提取data对象?

========================== 编辑 ============= ===========

似乎是

的原因
resource.get({id:user_id, node: "albums", access_token: ....}).then(function(response)
{
    console.log(response)
})

在另一个资源请求之后链接,如下所示:

    FB.get_user().then(function(response) {
  var user_id;
  return user_id = response.id;
}).then(function(response) {
  return self.albums = FB.resource.get({
    id: user_id,
    node: "albums",
    access_token: Auth.get_user().social_account_access_token
  });
}).then(function(response) {
  console.log("response", response); # Log #1
  return console.log("response.data", response.data); # Log #2
});

在这种情况下,日志#1 将注销resource对象,其中data为数组,而日志#2 则为{{ 1}}。

如果我不链接undefined函数,但将最后一个函数放在上一个then中,我会得到预期的结果:

.then

Log#1 提供相同的结果,而 Log#2 是包含9个元素的数组。

**所以我想知道我是原方法的问题吗?**


1 个答案:

答案 0 :(得分:0)

在您的第一次尝试中发生的事情是,在您的第二次then()中,您返回FB.resource.get()的返回值,但此值不是一个承诺,因此then()会立即解决,并且在检索数据之前,处理移动到下一个then()。当您在Chrome调试器中查看值时,您将停止执行足够长的时间以完成请求,并在您观察数据时填充数据。 (顺便说一下,有一个term for this phenomenon。)

根据this pull requestthis note in the developer's guide上的说明,如果您想要链接资源请求,则应使用instance.$promise。因此,使用$promise的第二种方法或多或少是正确的方法。

您的代码可以稍微清理一下。除非您有理由想要单独的步骤来提取FB用户ID并将其传递给下一步,否则您可以删除第一个.then()。你还可以做一些其他的整理:

FB.get_user()
.then(function (response) {
    var user_id = response.id;
    // the value assigned to self.albums here is a (mostly) empty object that will 
    // be populated with data when the request finishes
    self.albums = FB.resource.get({
        id: user_id,
        node: "albums",
        access_token: Auth.get_user().social_account_access_token
    });
    return self.albums.$promise;
})
.then(function (response) {
    // (avoid putting a [then] inside another [then] unless you need to)
    console.log("A: response", response);
    console.log("response.data", response.data);
    return response.data;
});