2014-07-03 5 views
0

Voici donc ce que je dois faire. J'utilise la bibliothèque Angular Deferred Bootstrap dans mon code car j'ai besoin de recevoir des données essentielles d'un serveur RESTful avant de démarrer et d'essayer de charger le contenu. Quoi qu'il en soit, je dois faire un deuxième appel une fois le premier appel résolu. Le deuxième appel est un identifiant qui dépend de l'URL contenue dans la première réponse.

Maintenant, je veux essayer de faire l'appel de connexion une fois que je reçois ces données (j'essayais dans le bloc .success()) mais une fois le premier appel résolu, le programme commence l'amorçage avant la fin de l'appel de connexion ; les choses cassent parce que je ne suis pas "connecté" sur le serveur.

window.deferredBootstrapper.bootstrap({ 
       element: window.document.body, 
       module: 'app', 
       resolve: { 
        STARTUP_CONFIG: ['$http', function($http) { 
         return $http.get(url1 + 'blah/blah/blah/' + layout); 
        }], 

        CONTEXT_CONFIG: ['$http', function($http) { 
         return $http.get(url1 + 'blah/blah/blah/blah'). 
         success(function(data) { 
          $http.post('https://' + data.url2 + '/10001/guestidentity?client_id=' + data.id). 
          success(function(result){ 
           token = result.token; 
          }); 
         }); 
        }], 
       } 
      }); 

Quelqu'un at-il une idée de ce que je peux faire?

+0

'mais une fois le premier appel résolu, il renvoie la promesse résolue avant la fin de l'appel de connexion'hh .... non ... il renvoie immédiatement la promesse non résolue, puis lorsqu'elle est résolue, la seconde commence. –

+0

Ce que je voulais dire, c'est que la bibliothèque d'amorçage différée empêche mon application d'amorcer jusqu'à ce que la promesse se résolve. – Fowarek

+0

Le problème est que vous renvoyez une promesse qui représente le premier $ http plutôt que le second. Vous ne vous souciez pas vraiment quand le premier se résout parce que vous voulez qu'il continue après la seconde résolution, pas la première. La réponse de Dayan gère cela. –

Répondre

1

salut puisque c'est une promesse que vous pouvez enchaîner le prochain appel à la fonction alors quelque chose comme

$http(url). 
    then(function(response){ 
      //note that this shouldn't be the body of the response 
      // but the entire response stream so you need to check for the status code and the body and apply and possibly apply any transformation that is needed as it will probably be just text 
      // then we can start the other call 
      return $http(url); 
    }) 

cette manière, la deuxième promesse sera traité à la destination finale.

+0

il ne devrait pas avoir à faire d'autres transformations que d'utiliser 'response.data.token' plutôt que' response.token' –