打开社交查看器状态(isOwner)

时间:2010-06-25 09:52:43

标签: javascript timeout callback opensocial

我们正在为opensocial API 0.7创建一个小工具。 在某些功能中,如果观众是所有者,我们必须决定。

我们无法为此目的使用通常的功能:
return gadgets.util.getUrlParameters().viewer == gadgets.util.getUrlParameters().owner; 所以我们必须创建一个变通方法并通过DataRequest获取信息。

DataRequest调用回调函数,没有可用的返回值。 我们通过使用全局变量设置相应的值来尝试快速入侵。

此时的问题是,该函数没有“等待”回调函数完成。我们知道这根本不是很好的代码/样式,但我们试图强制超时以达到调试的目的。

处理回调函数中的所有代码(如opensocial docs的示例中所示)是不可能的。 我们正在寻找像JavaScript中真正的'sleep()'等待回调函数完成的东西,或者获取有关查看者的所有者信息的另一种选择。

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 个答案:

答案 0 :(得分:1)

您是否可以使用其他标志来指示远程查询是否已返回所需的值?

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  
}