Мы создаем гаджет для opensocial API 0.7.
В некоторых функциях мы должны решить, является ли зритель владельцем.
Мы не могли использовать обычную функцию для этой цели:
return gadgets.util.getUrlParameters().viewer == gadgets.util.getUrlParameters().owner;
поэтому нам пришлось создать обходной путь и получить информацию через DataRequest.
DataRequest вызывает функцию обратного вызова и не имеет полезного возвращаемого значения.
Мы попытались быстро взломать, используя глобальные переменные, чтобы установить соответствующее значение.
Проблема в том, что функция не «ждет» завершения функции обратного вызова. Мы знаем, что это не совсем хороший код / стиль, но мы попытались установить тайм-аут по причинам отладки.
Обработка всего кода внутри функции обратного вызова (как это предлагается в примерах с документами opensocial) невозможна.
Мы ищем что-то вроде реального sleep () в JavaScript, чтобы дождаться завершения функции обратного вызова, или другую альтернативу, чтобы получить информацию о владельце о зрителе.
globalWorkaroundIsOwner = false;
function show_teaser(){
if (current_user_is_owner()){
// ...
}
// ...
}
function current_user_is_owner() {
var req = opensocial.newDataRequest();
req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), 'viewer');
// This will set the the correct value
req.send( user_is_owner_workaround );
// This is an attempt to delay the return of the value.
// An alert() at this point delays the return as wanted.
window.setTimeout("empty()", 2000);
// This return seems to be called too early (the variable is false)
return globalWorkaroundIsOwner;
}
function user_is_owner_workaround(dataResponse) {
var viewer = dataResponse.get('viewer').getData();
globalWorkaroundIsOwner = viewer.isOwner();
// value is correct at this point
}