2017-03-27 1 views
1

im faisant 2 demandes, mais quand j'obtiens les valeurs du résultat si j'appelle la variable en dehors de la promesse elle obtiennent la nullité, mais puisque je dépend du résultat de requrest de 2 promisses différentes et aussi j'ai besoin du exécuter une fonction basée sur le résultat de chaque promesse je n'ai aucune idée comment je peux le résoudre.2 promesses ensemble retournant null

Mon contrôleur de code:

$scope.originLatLong = null; 
    $scope.destinationLatLong = null; 

    //Get LAT and LONG from origin and destionation http://something/{Code} 
    $http.get('something/getLatLng/'+$scope.originAirport).then(function(response){ 
     $scope.originLatLong = response.data; //doesnt return null 

    }); 

$http.get('something/'+$scope.destinationAirport).then(function(response){ 
     $scope.destinationLatLong = response.data; //doesnt return null 

    }); 

console.log($scope.originLatLong) //returns null 
console.log($scope.destinationLatLong) //returns null 
var distanceTotal = calculate($scope.destinationLatLong,$scope.originLatLong); 

Répondre

1

Essayez comme ceci:

$scope.originLatLong = null; 
$scope.destinationLatLong = null; 

$http.get('something/getLatLng/'+$scope.originAirport).then(function(response){ 
    $scope.originLatLong = response.data; 
    return $http.get('something/'+$scope.destinationAirport) 
}) 
.then(function(response) { 
    $scope.destinationLatLong = response.data; 
    var distanceTotal = calculate($scope.destinationLatLong,$scope.originLatLong); 
}) 

ou si vous avez besoin distanceTotal en dehors .alors(), déclarer avant que les appels http:

$scope.originLatLong = null; 
$scope.destinationLatLong = null; 
var distanceTotal; 

$http.get('something/getLatLng/'+$scope.originAirport).then(function(response){ 
    $scope.originLatLong = response.data; 
    return $http.get('something/'+$scope.destinationAirport) 
}) 
.then(function(response) { 
    $scope.destinationLatLong = response.data; 
    distanceTotal = calculate($scope.destinationLatLong,$scope.originLatLong); 
}) 

Modifier avec explication du problème d'origine:

Les appels $http sont asynchrones, ce qui signifie que le navigateur effectue les demandes et que le code qui les suit continue de s'exécuter pendant que le navigateur attend une réponse du serveur. Cela signifie que l'ordre du code a été exécuté dans votre exemple était quelque chose comme

$http call 
The other $http call 
console.log($scope.originLatLong) 
console.log($scope.destinationLatLong) 
var distanceTotal = calculate($scope.destinationLatLong,$scope.originLatLong); 
$scope.originLatLong = response.data; 
$scope.destinationLatLong = response.data; 

voir comment les variables sont toujours à la console.log() null/s non définie, il est facile de voir pourquoi les console.logs sont indéfinis.

Une autre modification à cause de la confusion:

Vous ne pouvez pas supposer distanceTotal à définir en dehors de la fonction .then(). Le seul endroit garanti dans lequel il sera défini est then().

+0

Merci Fissio, pourriez-vous me dire ce que je faisais mal ou pourquoi ne fonctionnait pas? – Pedro

+0

Bonjour, j'ai fait un console.log (distanceTotal) en dehors des promesses et rien ne montre, m'a donné un indéfini " – Pedro

+0

Vérifiez mon édition, le problème est probablement le même.Vous devez mettre le code en utilisant' distanceTotal' à l'intérieur du ' .then() '. – Fissio

0

Comme cela a plusieurs promesses et que vous voulez utiliser les deux réponses ensemble, je résoudrais cela en utilisant $q.all.

Tout ce que nous devons faire est de créer un tableau de promesses. Et avec $q.all, nous pouvons obtenir la réponse des deux promesses dans un .then(). Voici comment:

var promises = []; 
promises.push($http.get('something/getLatLng/'+$scope.originAirport)); 
promises.push($http.get('something/'+$scope.destinationAirport)); 

$q.all(promises).then(function(response) { 
    $scope.originLatLong = response[0].data; 
    $scope.destinationLatLong = response[1].data; 

    console.log($scope.originLatLong) 
    console.log($scope.destinationLatLong) 
    var distanceTotal = calculate($scope.destinationLatLong, $scope.originLatLong); 
    ... 
});