Открытое состояние просмотра в социальных сетях (isOwner) - PullRequest
0 голосов
/ 25 июня 2010

Мы создаем гаджет для 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  
}

1 Ответ

1 голос
/ 25 июня 2010

Можно ли использовать дополнительный флаг для указания, вернул ли удаленный запрос требуемое значение?

var globalWorkaroundIsOwner = false;
var workaroundStarted = false, workAroundComplete = false;
var checker;

function show_teaser(){
    if (!workaroundStarted) {
        workaroundStarted = true;
        current_user_is_owner();
    }
    if (workaroundComplete) {  
    if (globalWorkaroundIsOwner){  
        // ...  
    }  
    // ...  
      if (checker) {
      clearInterval(checker);
      }
    }
}  

function current_user_is_owner() {  

    var req = opensocial.newDataRequest();  
    req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER), 'viewer');  

    checker = setInterval("show_teaser()", 1000);
    // This will set the the correct value  
    req.send( user_is_owner_workaround );  
}  

function user_is_owner_workaround(dataResponse) {  
    var viewer = dataResponse.get('viewer').getData();  

    globalWorkaroundIsOwner = viewer.isOwner();  
    workAroundComplete = true;
    // value is correct at this point  
}
...