我使用$ 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个元素的数组。
**所以我想知道我是原方法的问题吗?**
答案 0 :(得分:0)
在您的第一次尝试中发生的事情是,在您的第二次then()
中,您返回FB.resource.get()
的返回值,但此值不是一个承诺,因此then()
会立即解决,并且在检索数据之前,处理移动到下一个then()
。当您在Chrome调试器中查看值时,您将停止执行足够长的时间以完成请求,并在您观察数据时填充数据。 (顺便说一下,有一个term for this phenomenon。)
根据this pull request和this 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;
});