Javascript 从JSON获取数据并将此元素添加到$scope变量中

Javascript 从JSON获取数据并将此元素添加到$scope变量中,javascript,angularjs,Javascript,Angularjs,我需要添加元素,以JSON格式将其作为$scope.array添加到数组中 我的代码是: $scope.sections=function(){ $scope.array=[]; $http.get("/app/query/?mod=find&type=all").success(function(data){ $.each(data, function(i, row){ $scope.array.push('aaa');

我需要添加元素,以JSON格式将其作为$scope.array添加到数组中 我的代码是:

$scope.sections=function(){
    $scope.array=[];

    $http.get("/app/query/?mod=find&type=all").success(function(data){

        $.each(data, function(i, row){
            $scope.array.push('aaa');
            console.log(row);
        });


    });
    return $scope.array;
}
console.log($scope.sections());
但此函数返回空数组,如何向
$scope.array
添加元素


此字符串将数据正确地添加到consol
console.log(行)
,但是
$scope.array.push
不起作用

因为
$http
是异步的,它将返回一个空数组,因为从服务器获取数据需要时间,这就是为什么
console.log(row)
正确返回数据的原因

您还需要调用
$scope.$apply()
,以便将新数据应用于作用域

 $scope.sections=function(callback){
  $scope.array=[];

  $http.get("/app/query/?mod=find&type=all").success(function(data){
       var temp = [];
       $.each(data, function(i, row){
          temp.push('aaa');
          console.log(row);
       });

       $scope.$apply(function () {
          $scope.array = temp;
       });        

       callback($scope.array);
   });
 }

 $scope.sections(function(result) { console.log(result); });

我会把它改成这样

$scope.sections=function(){
  return $http.get("/app/query/?mod=find&type=all").then(function(resp){
      var array = [];
      angular.forEach(resp.data, function(row, i){
          array.push(row);
          console.log(row);
      });
      return array;
  });
};
$scope.array = $scope.sections();
$scope.array.then(function(data) { console.log(data); });
在这种情况下,我们只需返回函数的整个承诺。现在$scope.array是一个承诺,而不是一个原始值

在返回承诺之前,我们执行一个额外的then函数来操作返回值。我们希望将其转换为数组,以便promise的任何未来用户都能看到它解析为数组而不是对象。你可以做任何你需要的转换,我只是从你的问题中提取逻辑

请记住,现在您的代码必须知道如何处理承诺,而不是数组,但这样可以确保始终解析值。如果您确实需要使用插值或其他方式将其绑定到UI,angular将自动解析承诺。比如说

<div>{{array}}</div>
{{array}

在您的标记中,将自动解析为准备就绪时创建的数组。不需要额外的代码。

这是由于调用的异步性质造成的。可能重复的调用不必使用作用域。$在带有$http服务的回调中应用。当您可以返回承诺本身时,创建自己的回调参数也是毫无意义的。AngularJS在内部很好地处理承诺,当它们准备好时,会自动为您解决它们。您正在promise对象中已有的功能之上添加一个不必要的层。我的意思见下面我的答案。