Angularjs Angular JS服务调用不返回数组

Angularjs Angular JS服务调用不返回数组,angularjs,Angularjs,我正在尝试创建一个服务,返回角JS中热图的坐标 服务内容如下: var traffic = angular.module('traffic', ['ngMap']) .factory('checkpointService', function($q){ return function($scope, $http){ var d = $q.defer(); $http.get("http://127.0.0.1:8000/traffic/get/?end=" + $scop

我正在尝试创建一个服务,返回角JS中热图的坐标

服务内容如下:

var traffic = angular.module('traffic', ['ngMap'])
.factory('checkpointService', function($q){
  return function($scope, $http){
    var d = $q.defer();
      $http.get("http://127.0.0.1:8000/traffic/get/?end=" + $scope.endDateTime + "&format=json&search=Search&start=" + $scope.startDateTime)
       .then(function(response) {
              var points = []
              angular.forEach(response.data, function(value, key) {
                console.log("Response: " + JSON.stringify(response))
                points.push(new google.maps.LatLng(JSON.parse(JSON.stringify(value))["lat"], JSON.parse(JSON.stringify(value))["long"]))
            });
            //d.resolve(points)
            console.log("Points: " + points)
            return points;
          });


    }
  });
电话:

    var points = new Array();
    points = checkpointService($scope, $http)
    heatmap = new google.maps.visualization.HeatmapLayer({
        data: points,
        map: $scope.map

  });
错误是“不是数组”

我知道$http调用是异步的,因此使用了承诺。我也尝试过使用$q.defer:

.factory('checkpointService', function($q){
  return function($scope, $http){
    var d = $q.defer();
      $http.get("http://127.0.0.1:8000/traffic/get/?end=" + $scope.endDateTime + "&format=json&search=Search&start=" + $scope.startDateTime)
       .then(function(response) {
              var points = []
              angular.forEach(response.data, function(value, key) {
                console.log("Response: " + JSON.stringify(response))
                points.push(new google.maps.LatLng(JSON.parse(JSON.stringify(value))["lat"], JSON.parse(JSON.stringify(value))["long"]))
            });
            d.resolve(points)
            console.log("Points: " + points)
            return d.promise;
          });


    }
  });
并致电:

var points = [];
    points = checkpointService($scope, $http)
    points.then(function(){
    heatmap = new google.maps.visualization.HeatmapLayer({
        data: points,
        map: $scope.map

  })});
在本例中,错误改为“无法读取未定义的“then”属性”


我意识到也有类似的问题;我已经阅读了它们和文档。我仍在努力理解。我知道服务中的$http调用是成功的。但是,我相信heatmap数据参数中的点是空的。简单地说,该服务应该返回一组LatLng点来绘制热图。

在您第一次接近时,您已经非常接近了

var traffic = angular.module('traffic', ['ngMap'])
    .factory('checkpointService', function ($q) {
        return function ($scope, $http) {
            return $http.get("http://127.0.0.1:8000/traffic/get/?end=" + $scope.endDateTime + "&format=json&search=Search&start=" + $scope.startDateTime)
                .then(function (response) {
                    var points = []
                    angular.forEach(response.data, function (value, key) {
                        console.log("Response: " + JSON.stringify(response))
                        points.push(new google.maps.LatLng(JSON.parse(JSON.stringify(value))["lat"], JSON.parse(JSON.stringify(value))["long"]))
                    });
                    //d.resolve(points)
                    console.log("Points: " + points)
                    return points;
                });


        }
    });


checkpointService($scope, $http).then(function (points) {
    heatmap = new google.maps.visualization.HeatmapLayer({
        data: points,
        map: $scope.map

    });
});
我改变的是:

  • 确保checkpointService函数返回$http承诺
  • 谷歌地图比特现在是成功的承诺处理程序。此处理程序接收您在服务中创建的点数组作为第一个参数。将该数组传递给Google maps API
  • 删除了$q.defer()位,因为不再需要该位

  • 您不需要将
    $http
    包装在
    延迟
    中,因为它已经返回承诺。问题是您在回调函数中声明了
    points[]
    ,但在承诺完成之前,尝试从外部函数返回它;回调尚未运行,无法访问
    。在大多数情况下,您会在服务中看到
    返回$http…
    ,并且变量分配在控制器中完成。这些注释也很有用。谢谢