Мое приложение выполняет следующие действия:
1. Запрашивает разрешение friends_online_presence.
2. Если пользователь дал разрешение (т. Е. Обратный вызов показал успешность), я немедленно проверяю права доступа (*) и в зависимости от результата извлекаю данные пользователя (вызов getOnlineFriends).
Проблема в том, что для обновления разрешений на своих серверах Facebook требуется несколько миллисекунд. Поэтому, когда я безотлагательно запрашиваю разрешения, которые я только что попросил, Facebook всегда говорит, что у меня нет разрешения.
Использование setTimout "решает" проблему.
Как это можно решить детеминистически?
Я попробовал какую-то примитивную форму опроса, но браузер застрял (и это тоже похоже на кривое решение).
(*) 'ВЫБЕРИТЕ friends_online_presence ОТ разрешений, ГДЕ 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();
}
});