2016-08-20 12 views
0

私はAngularJSでFacebookログインAPIを使用しようとしています。しかし、私は変数を更新することができません。AngularJSのグローバル変数が更新されない

$scope.init = function() { 
    $scope.name = "" 
    window.fbAsyncInit = function (response) { 
     FB.init({ 
      appId: 'xxxxxxxxxxxxxxxxxxx', 
      xfbml: true, 
      version: 'v2.7' 
     }); 
     FB.getLoginStatus(function (response) { 
      if (response.authResponse) { 
       //Calling Fb graph api if user is log in and fetching name of user 

       FB.api('/me', { 
        fields: 'name' 
       }, function (response) { 
        $scope.name = response.name; 
        console.log($scope.name); // 1 
       }); 
       console.log($scope.name); // 2 

      } 
     }); 
    }; 
    console.log($scope.name); // 3 
} 

console.log()即ちのみFB.apiに、$scope.nameに正しいデータを示しています。しかし、他は更新された価値を示さない。

+0

まず、3行目の最後にセミコロンがない理由はありますか?第二に、明白な確認のリスクで... FB.apiの呼び出しがエラーにならないようにコンソールをチェックインしていますか? – dat

+0

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – JLRishe

答えて

2

これは、コードがfb.api呼び出しで非同期で、$ scope.nameがまだ割り当てられていないためです。コードで

FB.api('/me',{fields: 'name'}.function(response) 
{ 
    $scope.name=response.name; //$scope.name is assigned 
    //1 
    console.log($scope.name); 
}); 

// 2 
console.log($scope.name); //$scope.name is not YET assigned, because i'm called first! 

Fb.apiを行う(及びインナー機能を実行)する遅延の1、100又はxxxmsを必要とするかもしれません。しかし、あなたのコンソールログは、($ 2)fb.api関数の実行直後に呼び出されます(解決ではありません)ので$ scope.nameはまだ割り当てられていません。

詳細については、非同期コールバックとjavascriptに関する約束についてのチュートリアルをご覧ください。

関連する問題