обещание Javascript не выполняется тогда - PullRequest
0 голосов
/ 11 сентября 2018

Пожалуйста, помогите ... что я делаю не так.

В моем контроллере у меня есть эта функция, которая вызывает геокодер Google, я пытаюсь встроить его в обещание, чтобы результаты правильно возвращались в$ сфера.Я прошел через 20 различных итераций и до сих пор не могу заставить его работать.Функции работают, я получаю результаты ... но я не могу получить результаты в области $ ... при попытке инкапсулировать геокодер в обещание, которое дает мне ошибки Cannot read property 'then' of undefined

   function getPosition(thisLat,thisLon) {
    // Retrieve address information based on Lat/Lng info

    var q = $q.defer() ;
    var thisLocation = getLL(thisLat,thisLon) ;
    var addressInfo = {};
    var notFound = 0 ;
    geoCoder.geocode({'latLng': thisLocation}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        for (var x=0;x<results.length;x++) {  
          var googleInfo = results[x].address_components ;
          for (var y=0;y<googleInfo.length;y++) {
            addressInfo.fullAddress = results[x].formatted_address;
            q.resolve(addressInfo) ;
          }        
        }
      } else {
        return q.reject("none" ) ;
      }
      return q.promise ;
    });
  }

  $scope.getEntrances = function() {
    for (var x=0;x<$scope.park.entrances.length;x++) {
     getPosition($scope.park.entrances[x].coordinates[0],$scope.park.entrances[x].coordinates[1])
     .then(function(result) {
         $scope.park.entrances[x].addressInfo = result ; 
      }) ;
    }
  }
  $scope.getEntrances() ;

1 Ответ

0 голосов
/ 11 сентября 2018

Попробуйте вернуть ваше обещание q из самой функции getPosition(), а не из функции обратного вызова geoCoder.

Короче говоря, сдвиньте return q.promise; в конец функции getPosition() следующим образом:

function getPosition(thisLat,thisLon) {
    // Retrieve address information based on Lat/Lng info

    var q = $q.defer() ;
    var thisLocation = getLL(thisLat,thisLon) ;
    var addressInfo = {};
    var notFound = 0 ;
    geoCoder.geocode({'latLng': thisLocation}, function(results, status) {
      if (status == google.maps.GeocoderStatus.OK) {
        for (var x=0;x<results.length;x++) {  
          var googleInfo = results[x].address_components ;
          for (var y=0;y<googleInfo.length;y++) {
            addressInfo.fullAddress = results[x].formatted_address;
            q.resolve(addressInfo) ;
            break; // [UPDATE] Avoid calling resolve on a promise multiple times
          }        
        }
      } else {
         q.reject("none" ) ; // [UPDATE] Don't need a return statement here
      }
    });

    // [UPDATE] return q.promise from here
    return q.promise ;
  }
...