2016-05-20 3 views
2

0 Ich bin nicht in der Lage, herauszufinden, was ich mit meinem Code verwenden und wie man Versprechungen verwenden soll. mit meinen $ http Anrufen.

Ich habe folgende Funktionen

erste i

$scope.getAcessToken() 

anrufen möchten, und sobald ich das Zugriffstoken bekommen würde ich den folgenden Aufruf

$scope.getDataSets(lastSaved, cTime, accessToken) 

Die beiden Funktionen machen werden wie folgt:

$scope.getAcessToken = function() 
    { 
    alert("inside getAcessToken function"); 
    refreshToken = localStorage.getItem("refreshToken"); 
    if(refreshToken) 
    { 
     $http({ 
      method: "post", url: "https://accounts.google.com/o/oauth2/token", 
      data: "client_secret=" + clientSecret + "&grant_type=refresh_token" + "&refresh_token="+ refreshToken + "&client_id=" + clientId 
       }) 
     .success(function(data){ 
      accessToken = data.access_token; 
     }) 
     .error(function(data,status){ 
     alert("ERROR: " + JSON.stringify(data) + status); 
     }); 
    } 
    else 
    { 
     $scope.firstTimeAuth(); 
    } 
    return accessToken; 
    } 

und

$scope.getDataSets = function(startTime, endTime, accessToken,) 
    { 
    $scope.a = "inside dataSets function"; 
    $url = "https://www.googleapis.com/fitness/v1/users/me/dataSources/derived:com.google.step_count.delta:com.google.android.gms:estimated_steps/datasets/" + startTime +"000000"+"-"+ endTime + "000000"; 
    alert("acess token is " + accessToken); 
    if(accessToken != "") 
    { 
     $http({method: 'GET', url: $url, 
         headers: {'Authorization': 'OAuth ' + accessToken},    
      }) 
      .success(function(response){ 
       alert("inside success block datasets"); 
       $scope.handleResponse(response); 
      }) 
      .error(function(response) { 
       alert("Something went wrong" + JSON.stringify(response)); 
      }); 
     } 
     else 
     { 
      alert("no access token received"); 
     } 
    } 

So wird erhalten Datensätze ausgeführt, bevor ich tatsächlich bekommen das Zugriffstoken , wie es zu verhindern ?? EDIT 1:

$scope.firstTimeAuth = function(callback) { 
     var ref = window.open('https://accounts.google.com/o/oauth2/auth?client_id=' + clientId + '&redirect_uri=http://localhost/callback&scope=https://www.googleapis.com/auth/fitness.activity.write &approval_prompt=force&response_type=code&access_type=offline', '_blank', 'location=no'); 
     ref.addEventListener('loadstart', function(event) { 

     if((event.url).startsWith("http://localhost/callback")) { 
      requestToken = (event.url).split("code=")[1]; 

      $http({ 
       method: "post", url: "https://accounts.google.com/o/oauth2/token", 
       data: "client_id=" + clientId + "&client_secret=" + clientSecret + "&redirect_uri=http://localhost/callback" + "&grant_type=authorization_code" + "&code=" + requestToken 
       }) 
       .success(function(data) { 
         accessToken = data.access_token; 
         refreshToken = data.refresh_token; 
         if(typeof(Storage) != "undefined") { 
          localStorage.setItem("refreshToken", refreshToken); 
          alert(localStorage.getItem("refreshToken")); 
         } else { 
          alert("Sorry, your browser does not support Web Storage..."); 
         } 
         //$location.path("/secure"); 
        }) 
       .error(function(data, status) { 
         alert("ERROR: " + data); 
        }); 
       ref.close(); 
      } 
     }); 
     callback(); 
    } 
+0

Sie gehen zu müssen, um die Versprechen der Anruf auf $ http erzeugt zurückkehren, könnten Sie den Code für das hinzufügen 'firstTimeAuth' Funktion – phuzi

+0

In einem anderen Hinweis, sollten Sie wirklich weg von der Verwendung der" Erfolg "und" Fehler "Legacy-Versprechen Methoden, wie sie sind [veraltet] (https://docs.angularjs.org/api/ng/ service/$ http # deprecation-notice) – phuzi

+0

okay, ich bin ziemlich neu in diesem .. so war nicht sicher, was man anstelle von Erfolg Block verwenden. erstmalige Auth ist eine Funktion ähnlich getaccessToken es hat auch einen $ http Anruf. Wie auch immer, ich füge es hinzu – Shravan

Antwort

2

Sie haben defer in Ihrem $scope.getAcessToken Funktion verwenden, um die gesamte Funktion ein Versprechen zu machen. Um es funktionierend zu haben, müssen Sie das $q in Ihren Kontroller Abhängigkeiten hinzufügen. Ihre Funktion sieht nun wie folgt aus:

$scope.getAcessToken = function(){ 
     alert("inside getAcessToken function"); 
     refreshToken = localStorage.getItem("refreshToken"); 
     var deferred = $q.defer(); 
    if(refreshToken){ 
      $http({ 
       method: "post", url: "https://accounts.google.com/o/oauth2/token", 
       data: "client_secret=" + clientSecret + "&grant_type=refresh_token" + "&refresh_token="+ refreshToken + "&client_id=" + clientId 
        }) 
      .success(function(data){ 
       accessToken = data.access_token; 
       deferred.resolve(true); 
      }) 
      .error(function(data,status){ 
       alert("ERROR: " + JSON.stringify(data) + status); 
       deferred.resolve(true); 
      }); 
     } 
     else 
     { 
      $scope.firstTimeAuth(); 
     } 
     return deferred.promise; 
     } 

Jetzt können Sie diese Funktion als Versprechen verwenden, so dass, wenn diese abgeschlossen ist, $scope.getDataSets nennen.

+0

Danke für die Antwort ... werde zurückkommen, sobald ich fertig bin, daran zu arbeiten. Nochmals vielen Dank :) – Shravan

+0

Jedes Mal, wenn [latent antipattern] (https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns#the-deferred-anti-pattern) verwendet wird, ist ein Versprechen gebrochen. – estus

1

Sie müssen $ q Service von angularjs verwenden, um sicherzustellen, dass die Aufrufsequenz mehrerer Methoden. ($q doc link)

Unten ist die höchstwahrscheinlich implementiert Code wie pro Ihre Anforderung:

$scope.getAcessToken = function() 
    { 
    var deferral = $q.defer(); 

    alert("inside getAcessToken function"); 
    refreshToken = localStorage.getItem("refreshToken"); 
    if(refreshToken) 
    { 
     $http({ 
      method: "post", url: "https://accounts.google.com/o/oauth2/token", 
      data: "client_secret=" + clientSecret + "&grant_type=refresh_token" + "&refresh_token="+ refreshToken + "&client_id=" + clientId 
       }) 
     .success(function(data){ 
      deferral.resolve({ accessToken: data.access_token }); 
     }) 
     .error(function(data,status){ 
     alert("ERROR: " + JSON.stringify(data) + status); 
     deferral.reject({ accessToken: data.access_token, error: JSON.stringify(data) + status}); 
     }); 
    } 
    else 
    { 
     $scope.firstTimeAuth(); 
    } 
    return deferral.promise; 
    } 

    $scope.getDataSets = function(startTime, endTime, accessToken,) 
    { 
    $scope.a = "inside dataSets function"; 
    $url = "https://www.googleapis.com/fitness/v1/users/me/dataSources/derived:com.google.step_count.delta:com.google.android.gms:estimated_steps/datasets/" + startTime +"000000"+"-"+ endTime + "000000"; 
    alert("acess token is " + accessToken); 
    if(accessToken != "") 
    { 
     $http({method: 'GET', url: $url, 
         headers: {'Authorization': 'OAuth ' + accessToken},    
      }) 
      .success(function(response){ 
       alert("inside success block datasets"); 
       $scope.handleResponse(response); 
      }) 
      .error(function(response) { 
       alert("Something went wrong" + JSON.stringify(response)); 
      }); 
     } 
     else 
     { 
      alert("no access token received"); 
     } 
    } 


    // making sure that $scope.getDataSets will be called when $scope.getAcessToken() call is completed 
    $q.when($scope.getAcessToken()).then(function(result) { 
        $scope.getDataSets(startTime, endTime, result.accessToken,); 
       }); 
+0

Sieht aus wie Nuria Sie auf die Antwort –

+0

schlagen, das ist die andere Art, es zu implementieren. –

+0

Danke für die Antwort ... werde zurückkommen, sobald ich fertig bin, daran zu arbeiten. Danke noch einmal :) – Shravan

Verwandte Themen