2016-07-04 8 views
0

Ich habe eine Funktion, es hat eine $ http.post für Login-Zweck. Wenn Erfolg, ruft ein anderer $ http.post eine php-Datei auf, die Daten von der Datenbank holt. Das Problem ist, dass, wenn ich versuche, die Daten von localStorage zu laden, es mir null zurückgibt. Wieso ist es so?

$scope.loginUser = function() 
{ 
    var data = 
    { 
     username: $scope.loginInfo.username, 
     password: $scope.loginInfo.password 
    } 
    $http.post("endpoints/login.php", data).success(function(response) 
    { 
     if(response==="ERROR") 
     { 
      //DONT DO ANYTHING 
     }  
     else 
     { 
      localStorage.setItem("token", JSON.stringify(response)); 
      console.log("loginController: name is this " + localStorage); 
      fetchDataFunction(data); 
      $state.go("application"); 


      //$state.go("application", result); 
     }  
    }).error(function(error) 
    { 
     console.error(error); 
    }); 

} 

fetchDataFunction = function(data) 
{ 
    $http.post("endpoints/fetchData.php", data).success(function(response) 
    { 
     localStorage.setItem("data", JSON.stringify(response)); 
    }).error(function(error) 
    { 
     console.error(error); 
    }); 
} 
+1

Flow-Prozess keinen Sinn macht. Warum sollten Sie Daten nicht im Anwendungsstatus abrufen? – charlietfl

+0

Hallo mein Herr, ich möchte alle Daten direkt nach dem Login aus der Datenbank holen und die Applikationsseite laden und dort alle Daten anzeigen. – BlackHazelNut

+0

Richtig ... aber die Norm ist, zu laden, was der Staat selbst benötigt. Könnte es in einer "Auflösung" tun, so dass es alle verfügbar ist, bevor der Controller und die Vorlage geladen werden. Im Moment wechseln Sie die Zustände, bevor die fetchData-Anfrage abgeschlossen ist. – charlietfl

Antwort

0

können Sie kehren die $http.post, die ein Versprechen zurück, und dann den gesamten Code in der richtigen Reihenfolge arbeiten:

$scope.loginUser = function() { 
    login($scope.loginInfo).then(function (response) { 

     localStorage.setItem("token", JSON.stringify(response)); 
     console.log("loginController: name is this " + localStorage.getItem("token")); 

     fetchDataFunction(data).then(function() { 

      localStorage.setItem("data", JSON.stringify(response)); 
      console.log(localStorage.getItem("data")); 
      $state.go("application"); 

     }).catch(function (error) { 
      console.error(error); 
     }); 

    }).catch(function (response) { 

     console.error(error); 

    }); 
}; 

var login = function (user) { 
    return post("endpoints/login.php", user); 
}; 

var fetchDataFunction = function (data) { 
    return post("endpoints/fetchData.php", data); 
}; 

var post = function (url, data) { 

    var deferred = $q.defer; 

    $http.post(url, data).then(function (response) { 
     if (response === "ERROR") { 
      deferred.reject(response); 
     } 
     else { 
      deferred.resolve(response); 
     } 
    }).catch(function (error) { 
     deferred.reject(error); 
    }); 

    return deferred; 
}; 

Hinweise:

  • Sie müssen Stellen Sie sicher, dass Sie $ q in Ihren Controller zusammen mit $ http
  • injizieren Sie sollten localStorage.getItem() verwenden, wenn Sie Informationen von th abrufen global e Objekt
  • Sie then/catch statt success/error verwenden sollten, da diese jetzt abgeschrieben: https://docs.angularjs.org/api/ng/service/ $ http
Verwandte Themen