0

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

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

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

此时的问题是,该函数不会“等待”回调函数完成。我们知道这根本不是好的代码/风格,但出于调试原因,我们试图强制超时。

处理回调函数中的所有代码(如 opensocial 文档示例中所建议的)是不可能的。我们正在寻找类似于 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  
}
4

1 回答 1

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  
}
于 2010-06-25T10:16:06.577 回答