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 に答える