javascript - angularjs resolve promise




AngularJS: Retourner une promesse de l'intérieur.then? (2)

Enchaîne les promesses mais n'oublie pas d'enchaîner les rejets aussi ...

self.getCurrentUser = function() {
    return loginService.getCurrentUid().then(function(response) {
        if (response.data === 'false') {
            alertBoxService.trigger($rootScope.unexpectedApiResponse);
            return $q.reject(response); // convert into a rejection
        }
        return self.getUser(response.data); // chain the promise resolution
    }, function(response) {
        alertBoxService.trigger($rootScope.asyncFailed);
        return $q.reject(response); // chain the rejections
    });
}

Vous devrez bien sûr injecter le service $q .

Comme Bergi l'a fait remarquer , vous pouvez également rejeter la promesse en lançant une erreur au lieu d'utiliser $q.reject , par exemple

throw response;

J'ai un service d'utilisateurs. Je voudrais créer une méthode qui utilise un autre service que j'ai construit. Il existe deux méthodes sur ce service. getUser() et getCurrentUser() . getCurrentUser() utilise le service injecté qui acquiert l'UID. Il utilise l'UID retourné pour exécuter la méthode getUser() . Mon problème est que je ne peux pas obtenir getCurrentUser() pour retourner la promesse de deuxième niveau.

Cette question est un peu difficile à expliquer. Voici le code ...

svs.service("usersService", function($rootScope, $http, loginService, alertBoxService) {
  var self = this;
  self.getUser = function(identifier, column) {
    if (typeof(column) === 'undefined') column = "uid";
    return $http.get($rootScope.api + "/getUser/" + identifier + "/" + column);
  }
  self.getCurrentUser = function() {
    var currentUserPromise;
    loginService.getCurrentUid().then(
      function(response) {
        if (response.data === "false") {
          alertBoxService.trigger($rootScope.unexpectedApiResponse);
        } else {
          console.log(self.getUser(response.data));
          currentUserPromise = self.getUser(response.data);
        }
      }, function(response) {
        alertBoxService.trigger($rootScope.asyncFailed);
      }
    );
    return currentUserPromise;
  }
});

Le problème ici est que lorsque la fonction getCurrentUser est appelée, elle renvoie immédiatement une variable undefined . En effet, le service est asynchrone et au moment où la réponse est reçue sur le service, l'appel de fonction aurait déjà renvoyé une variable undefined . Pour éviter cela, vous pouvez ajouter l'appel de return dans le loginService .





resolve