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打印为未定义之后。

+0

由于其他答案指出该方法是异步的,所以它立即返回。成功回调在完成并填充变量时被调用,并且如果您已正确设置绑定,则您的UI将更新。它的行为完全如实。 – 2014-12-03 09:03:06

+0

现在我尝试获取像这样的数据: var getSomething = function(){ return $ http({method:“GET”,url:URL})然后(函数(result){ return result.data; }); };并将结果赋值给变量:$ scope.results = getSomething(); – hwg 2014-12-03 09:13:04

回答

8

这是因为$http.get是异步的。所以你的代码不会被搁置,直到ajax请求完成,而是会执行其余的代码。所以你的第二个console.log将在ajax请求完成之前执行。此时没有名为$scope.results的范围变量,该变量仅在请求完成后定义,这就是为什么它会打印undefined。你的第一个console.log只有在$http ajax成功完成后才会打印,此时你有$scope.results,它被分配到来自后端的data

+0

@ktoress所以如何让一个http.get不是异步的,并获得值的范围? – Demodave 2015-02-12 14:57:33

+0

无论如何,这个值将会变为$ scope,但可能需要更长时间(比如说半秒)。关键是你想要什么时候或在哪里使用它。如果你想在视图上显示它,你可以使用一个事件来确保它已经加载或等待。如果您需要其他功能,则可以在sucess()调用中调用该函数。 – Puce 2015-03-10 11:55:41

2

$httpasynchronous功能。它立即返回,但它返回promise不是真正的结果。当请求完成时onsuccess被调用。

第二个(呼叫之外的)console.log$http之前执行返回。