数据在AngularJS中的请求函数之外不起作用?

时间:2016-03-04 08:45:19

标签: angularjs angularjs-scope

如何在promise成功函数之外访问$ scope.categories

var categoryPromise = $http.get("../rest/mcategory");
categoryPromise.success(function(data, status, headers, config)
{
    $scope.categories=data;   
});

categoryPromise.error(function(data, status, headers, config)
{
    alert("Error");       
});   
alert(JSON.stringify($scope.categories));

我每次都未定义为什么?有办法外出吗?

3 个答案:

答案 0 :(得分:0)

$http调用是异步的,这意味着它不会按照代码的顺序执行,代码的实际顺序如下:

  1. 初始化类别提示$http
  2. alert
  3. categoryPromise finish
  4. categoryPromise success callback
  5. 因此,如果您想使用categoryPromise中的数据,则必须在success回调中执行此操作。

    附注:不要使用.success,已弃用。请使用.then,如下所示:

    promise.then(successCallback, errorCallback);
    

答案 1 :(得分:0)

正如Martijn指出的那样,如果您想将其用于直接修改,那么您将不得不在XHR请求未完成的情况下进行回调。

但是,如果您将其放入$scope,可能是因为您将数据绑定到DOM中,并将其用于您的视图中。在这种情况下,Angular非常简洁,因为当承诺得到解决时,在下一个$digest周期,它将填充您的$ scope域中所有{{category.strings}}的类别对象。

愿意在评论中发帖,但不要有50个代表。

答案 2 :(得分:-1)

这里的问题是网页点击,网页然后继续执行代码而不等待响应,这就是为什么这里的网址可能会被浏览器点击,但是当执行到达指定类别时它未定义。

解决方案:

var categoryPromise = $http.get("../rest/mcategory");
categoryPromise.success(function(data, status, headers, config)
{
    $scope.categories=data;   
   alert(JSON.stringify($scope.categories));
});

categoryPromise.error(function(data, status, headers, config)
{
    alert("Error");       
});