我们正在为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
}
答案 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
}