【问题标题】:javascript promise failing on thenjavascript 承诺在那时失败
【发布时间】:2019-02-15 12:32:21
【问题描述】:

请帮助...我做错了什么。

在我的控制器中,我有一个调用谷歌地理编码器的函数,我试图将它嵌入到一个承诺中,以便在 $scope 中正确返回结果。我已经经历了 20 次不同的迭代,但我仍然无法让它工作。函数工作,我得到了结果......但我无法将结果放入 $scope......当试图将地理编码器封装成一个承诺时,它给了我错误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() ;

【问题讨论】:

  • 为什么人们不发表评论就对这个问题投了反对票?
  • return q.promise; 下移两行

标签: javascript angularjs promise q


【解决方案1】:

尝试从getPosition() 函数本身返回您的承诺q,而不是从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 ;
  }

【讨论】:

  • 谢谢!!!我不敢相信我盯着它玩了好几个小时。我对自己感到非常沮丧,我浪费了很多时间试图弄清楚,解决方案是将return q.promise 向下移动一行。啊!
  • 别担心,有时可能是这样!祝你的项目一切顺利:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 2013-06-28
相关资源
最近更新 更多