AngularJS:将$http.get获取的数据赋值给变量

3
我尝试将$http.get获取的数据分配给我的控制器变量。
 $http.get(URL).success(function (data) {
      $scope.results = data;
      console.log('results in $http.get :'+ $scope.results);
    });

 console.log('results after http.get'+ $scope.results);

首先,控制台日志打印get请求返回的数据。在$http.get(url).success之后,$scope.results被打印为undefined。


正如其他答案所指出的那样,该方法是异步的,因此它会立即返回。当它完成并填充您的变量时,成功回调将被调用,如果您已经正确设置了绑定,您的UI将更新。它的行为完全符合预期。 - Lee Willis
现在我尝试获取这样的数据:var getSomething = function(){ return $http({method:"GET", url:URL}).then(function(result){ return result.data; }); }; 并将结果分配给变量:$scope.results = getSomething(); - hwg
2个回答

8
这是因为$http.get是异步的。所以你的代码在ajax请求完成之前不会被挂起,而是会执行其余的代码。因此,你的第二个console.log将在ajax请求完成之前执行。此时还没有叫做$scope.results的作用域变量,它只有在请求完成后才被定义,这就是为什么它打印undefined的原因。您的第一个console.log仅在$http ajax成功完成后打印,在这个时候您有$scope.results,它被赋值为来自后端的data

@ktoress,那么如何使http.get不是异步的,并在作用域中获取值呢? - Demodave
该值最终会存储在 $scope 变量中,但可能需要更长时间(约半秒钟)才能完成。重要的是你打算在何时何地使用它。如果你想在视图上显示它,可以使用事件来确保它被加载,或者只需等待即可。如果你需要在另一个函数中使用该值,则可以在成功回调函数中调用该函数。 - Puce

2

$http 是一个异步函数。它立即返回一个 promise,而不是真正的结果。当请求完成时,将调用 onsuccess

第二个(在调用外部的)console.log$http 返回之前执行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接