【发布时间】:2011-09-11 13:35:49
【问题描述】:
我的应用执行以下操作:
1. 请求friends_online_presence权限。
2. 如果用户授予权限(即回调指示成功),我立即测试权限(*)并根据结果提取用户的详细信息(调用 getOnlineFriends)。
问题在于 facebook 需要几毫秒来更新其服务器上的权限。因此,当我立即查询我刚刚要求 facebook 的权限时,总是说我没有权限。 使用 setTimout “解决”了这个问题。 如何确定性地解决这个问题? 我尝试了一些原始形式的轮询,但它让浏览器卡住了(而且它似乎也是一个歪曲的解决方案)。
(*) 'SELECT friends_online_presence FROM 权限 WHERE uid=me()'
代码:
c2p.facebook = {
requestViewOnlineFriendsPerms: function (callback) {
myStuff.requestPermission('friends_online_presence', callback);
},
requestPermission: function (perms, callback) {
FB.ui({
method: 'permissions.request',
perms: perms,
display: 'popup'
}, function (response) {
if (response && response.perms) {
if (callback) {
callback(true);
}
} else if (!response.perms) {
if (callback) {
callback(false);
}
}
});
fql: function (q, callback) {
FB.api({ "method": "fql.query", "query": q }, callback);
},
getOnlineFriends: function (callback) {
var q = 'SELECT friends_online_presence FROM permissions WHERE uid=me()';
c2p.facebook.fql(q, function (rows) {
var isPermissionGranted = true;
var q2 = "SELECT uid, name, pic_square, online_presence FROM user WHERE online_presence IN ('active', 'idle') AND uid IN (SELECT uid2 FROM friend WHERE uid1 = me()) ORDER BY name";
if (rows[0].friends_online_presence == 0) {
isPermissionGranted = false;
q2 = "SELECT uid, name, pic_square FROM user WHERE uid IN(SELECT uid2 FROM friend WHERE uid1=me()) ORDER BY name";
}
c2p.facebook.fql(q2, function (arr) {
callback(arr, isPermissionGranted);
});
});
}
}
// The way I call this code is:
c2p.facebook.getOnlineFriends(function (arr, isPermissionGranted) {
$("#tmplFriends").tmpl(arr, { getIndex: function () { return $.inArray(this.data, arr); } }).appendTo("#friendsDiv");
if (!isPermissionGranted) {
$('.c2p_hidden').show();
}
});
【问题讨论】:
-
如果 fb 需要一些时间来更新他们的服务器(并且在此之前成功回调返回),那么我认为您 可以 确定性地解决它。您必须自己轮询 fb 直到它“工作”,这基本上就是您使用 setTimeout 所做的事情。除非你没有正确使用 fb 回调。
-
你能告诉我们
callback的样子吗?这可能会有所帮助。 -
感谢您的回复。我已经添加了调用代码。
标签: javascript facebook facebook-fql