2016-08-20 8 views
0

Ich habe versucht, die Facebook-Login-API in AngularJS zu verwenden. Aber ich bin nicht in der Lage, eine Variable zu aktualisieren.globale Variable in AngularJS wird nicht aktualisiert

$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 
} 

Die erste console.log() zeigt die korrekten Daten in $scope.name, das heißt nur in FB.api. Aber die anderen zeigen nicht den aktualisierten Wert.

+0

Erstens gibt es einen Grund, am Ende der Zeile 3 kein Semikolon zu haben? Zweitens, auf die Gefahr hin, das Offensichtliche zu überprüfen ... checken Sie in der Konsole ein, um sicherzustellen, dass der Aufruf von FB.api nicht zu einem Fehler führt? – dat

+0

Mögliches Duplikat von [Wie gebe ich die Antwort von einem asynchronen Anruf zurück?] (Http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) – JLRishe

Antwort

2

Das liegt daran, dass Ihr Code im Aufruf fb.api asynchron ist und Ihr $ scope.name noch nicht zugewiesen ist.

im Code:

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 benötigt, 100 oder xxxms der Verzögerung durchzuführen (und führt die innere Funktion). Ihre Konsole loggt sich jedoch darunter (// 2) und heißt sofort nach der Ausführung der fb.api-Funktion (und nicht seiner Auflösung), so dass Ihr $ scope.name nicht bereits zugewiesen ist.

Für weitere Informationen lesen Sie ein Tutorial über async Callback und verspricht auf Javascript.