【问题标题】:AngularJS: assign $http.get data to variableAngularJS:将 $http.get 数据分配给变量
【发布时间】:2015-01-31 17:58:33
【问题描述】:

我尝试将 $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 打印为未定义之后。

【问题讨论】:

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

标签: javascript angularjs angularjs-scope angularjs-controller angularjs-http


【解决方案1】:

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

【讨论】:

  • @ktoress 那么如何让 http.get 不异步并获得范围内的值?
  • 该值无论如何都会转到 $scope,但可能需要更长的时间(比如说半秒)。关键是您想在何时何地使用它。如果你想在视图上显示它,你可以使用一个事件来确保它被加载或者只是等待。如果您需要它用于另一个函数,您可以在 sucess() 调用中调用该函数。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2019-03-10
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2016-05-11
    • 2020-02-14
    相关资源
    最近更新 更多