2014-08-30 1 views
0

J'ai fait un LocationService dans AngularJSpromesse de se résoudre avant même .resolve() est appelée

factory('LocationService', function ($q) { 
    var deferred = $q.defer(); 
    var curPos = {}; 
    var resolved = false; 

    return { 
     getPosition : function (refresh) { 
      if (!resolved || refresh) { 
       navigator.geolocation.getCurrentPosition(function (pos) { 
        curPos.curLat = pos.coords.latitude; 
        curPos.curLng = pos.coords.longitude; 
        resolved = true; 
        console.log("Resolve", curPos); 
        deferred.resolve(curPos); 
       }, function (error) { 
        deferred.reject('Unable to get location: ' + error.message); 
       }, { 
        enableHighAccuracy : true 
       }); 
      } else { 
       deferred.resolve(curPos); 
      } 
      return deferred.promise; 
     } 
    } 
}) 

et en utilisant comme ça

LocationService.getPosition(refresh).then(function (curPos) { 
    console.log('then'); 
    var latLng = new google.maps.LatLng(curPos.curLat, curPos.curLng); 
    $scope.map.setCenter(latLng); 
    $scope.map.setZoom(15); 
}); 

première fois il fonctionne très bien, mais quand je clique un bouton qui appelle getPosition(), il résout même avant les déclencheurs LocationServicedeferred.resolve(). et je reçois le mauvais résultat dans le rappel. Mais finalement après 2/3 secondes getCurrentPosition déclenche un rappel et la nouvelle valeur est définie dans curPos. Ce que je reçois pour la prochaine fois. La console imprime then en premier et Resolve après 2/3 secondes. Je ne suis pas capable de comprendre ce qui ne va pas ici. Quelqu'un pourrait-il guider un peu?

+0

Essayez-vous de mettre en cache des données? alors vous devez utiliser [$ cacheFactory] (https://docs.angularjs.org/api/ng/service/$cacheFactory) – Satpal

+0

Oui, je souhaite actualiser l'emplacement de l'utilisateur uniquement si je transmets l'actualisation explicitement. –

+0

Ok, je vais y jeter un coup d'œil. Mais ce n'est pas le problème ici, n'est-ce pas? –

Répondre

0

Votre différé est déclaré comme faisant partie de la construction du service. Une fois votre premier appel à getPosition terminé, ce différé est résolu. Vous devez créer et utiliser un nouveau différé pour chaque appel à getPosition.

Questions connexes