我正在尝试使用FB JS api并想知道我是否仍然可以使用FB.api中的“响应”。例如:
var picture;
FB.api('/me/picture?width=180&height=180', function (response) {
picture = response.data.url;
console.log(picture);
});
alert(picture);
以上代码将在警报窗口中显示“undefined”。
有没有办法在FB.api中使用“response.data.url”?
由于
更新: 以下是大图:我需要从FB用户帐户中检索一些信息,例如/ me / name,/ me / address / city,/ me / picture.data.url并将它们组合在一起,然后通过以下方式将信息发送到服务器AJAX。
var name;
var city;
var picture;
FB.api('/me', function (response) {
name = response.name;
FB.api('/me/address', function (adrresponse) {
city = adrresponse.city;
}
FB.api('/me/picture', function (imgresponse) {
picture = imgresponse.data.url;
}
//since FB API is async, the following is not correct!!!
var params = "name="+name+"&city="+city+"&picture="+picture;
//send out through AJAX.
var http = new XMLHttpRequest();
http.open("POST", url, true);
}
有没有更好的方法来完成上述工作?
更新2: 最好的方法是使用字段扩展 https://developers.facebook.com/docs/graph-api/using-graph-api/v2.3#fieldexpansion,如此问题的答案所示。 谢谢 德里克
答案 0 :(得分:2)
问题是警报触发时未填充picture
变量。它只会在FB.api
回调完成后填充。
var picture;
FB.api('/me/picture?width=180&height=180', function (response) {
picture = response.data.url;
// this would work correctly
alert(picture);
});
您尝试使用picture
变量做什么?也许你应该调用一个函数对回调中的图片做一些事情:
var picture;
FB.api('/me/picture?width=180&height=180', function (response) {
picture = response.data.url;
doSomethingWithPicture(picture);
});
实现目标的简单方法是:
FB.api('/me', function (response) {
var name = response.name;
FB.api('/me/address', function (adrresponse) {
var city = adrresponse.city;
FB.api('/me/picture', function (imgresponse) {
var picture = imgresponse.data.url;
doAjax(name, city, picture);
}
}
}
function doAjax(name, city, picture) {
//since FB API is async, the following is not correct!!!
var params = "name="+name+"&city="+city+"&picture="+picture;
//send out through AJAX.
var http = new XMLHttpRequest();
http.open("POST", url, true);
}
但是,这并不理想,因为您必须等/me/address
才能拨打/me/picture
。
以下是其他一些选项
/me
。如何完成#2
/me/address
和/me/picture
/。请参阅:https://github.com/kriskowal/q或https://api.jquery.com/category/deferred-object/开始使用这是完成所需内容的最佳方式(无需额外回调)
FB.api('/me', {fields: ['first_name', 'last_name', 'picture', 'address']}, function(response) {
// response will now have everything you need
console.log(response);
});
我最初没有给出这个答案,因为它不是似乎是范围界定的问题的主题。