2017-04-12 11 views
-3

私は変数関数から値を取得する方法は?

var isMember; 

         IsCurrentUserMemberOfGroup("Team Management System Members", function (isCurrentUserInGroup) { 
          if (isCurrentUserInGroup) { 
           //alert("Admin"); 
           isMember = true; 
           return true; 
          } 
          else { 
           isMember = false; 
           //alert("NoAdmin") 
          } 
         }); 

         alert(isMember); 

function IsCurrentUserMemberOfGroup(groupName, OnComplete) { 

         var currentContext = new SP.ClientContext.get_current(); 
         var currentWeb = currentContext.get_web(); 

         var currentUser = currentContext.get_web().get_currentUser(); 
         currentContext.load(currentUser); 

         var allGroups = currentWeb.get_siteGroups(); 
         currentContext.load(allGroups); 

         var group = allGroups.getByName(groupName); 
         currentContext.load(group); 

         var groupUsers = group.get_users(); 
         currentContext.load(groupUsers); 

         currentContext.executeQueryAsync(OnSuccess, OnFailure); 

         function OnSuccess(sender, args) { 
          var userInGroup = false; 
          var groupUserEnumerator = groupUsers.getEnumerator(); 
          while (groupUserEnumerator.moveNext()) { 
           var groupUser = groupUserEnumerator.get_current(); 
           if (groupUser.get_id() == currentUser.get_id()) { 
            userInGroup = true; 
            break; 
           } 
          } 
          OnComplete(userInGroup); 
         } 

         function OnFailure(sender, args) { 
          OnComplete(false); 
         } 
        } 

と呼ばれるように使用される他の関数にJavaスクリプト機能のうちの値を取得しようとしていますが、私は、私は値取得しています実行すると:未定義

ありがとう

+1

'IsCurrentUserMemberOfGroup'は非同期ですので、' isMember'に警告する際に値を割り当てることはできません。 – Li357

+1

あなたの質問に欠けている部分があります –

+0

'isMember'の値をチェックしようとする前に' IsCurrentUserMemberOfGroup'が起動されていることを確認する必要があります。 –

答えて

2

IsCurrentUserMemberOfGroupに関連付けられた機能があなたの前に呼び出されるようにする必要がありますisMemberの値をチェックしてみてください。関数のコードの後ろにalert()を置くだけで関数を最初に実行することはできません。

var isMember; 
 

 
function checkUser(isCurrentUserInGroup) { 
 
    if (isCurrentUserInGroup) { 
 
    isMember = true; 
 
    } else { 
 
    isMember = false; 
 
    } 
 
} 
 

 
alert(isMember); // undefined because function hasn't bee called yet 
 

 
checkUser();  // invoke the function with no data being passed in 
 

 
alert(isMember); // false because undefined was passed into function 
 

 
checkUser("Something"); // invoke the function with data being passed in 
 

 
alert(isMember); // true because something was passed into function

0

内部IsCurrentUserMemberOfGroup行くいくつかの非同期のものがありますほとんどの場合、あなたが渡しているコールバックは、すぐにあなたの非同期のものが完了すると延期されます。

はここで働い例です。

潜在的にあなたのIsCurrentUserMemberOfGroup機能は、この次のようになります。

function IsCurrentUserMemberOfGroup(someString, callback){ 
    .. 
    //async stuff here 
    myAPI.asyncMethod(callback); 

    //here the parser will go on with the synchronous code and park in the event queue the callback for the async method 
    .. 
} 

をできるだけ早くパーサは非同期機能に遭遇すると、コールバックがイベントキュー内に駐車されます。非同期機能(例えば、ファイルからの読み取り、ネットワーク処理など)は、終了時にジャバスクリプトスレッドに通知する他のOSタスクによって処理されるので、コールバックが最終的に呼び出される可能性がある。

問題はここにあります。 パーサーは、行ごとに同期して実行されるため、uiをブロックしないようにしなければなりません。なぜなら、メンバーがまだ割り当てられていないため、非同期の処理が完了する前に警告機能に到達し、

関連する問題