Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 从Angular服务返回http数据_Javascript_Angularjs - Fatal编程技术网

Javascript 从Angular服务返回http数据

Javascript 从Angular服务返回http数据,javascript,angularjs,Javascript,Angularjs,我相信这对于任何Angular/Javascript专家来说都是一个简单的问题。我有一个服务,它调用API来获取一些数据: app.service("GetDivision", ["$http", function($http){ this.division = function(divisionNumber){ $http.post("/api/division", {division:divisionNumber}).success(function(data){

我相信这对于任何Angular/Javascript专家来说都是一个简单的问题。我有一个服务,它调用API来获取一些数据:

app.service("GetDivision", ["$http", function($http){

  this.division = function(divisionNumber){
    $http.post("/api/division", {division:divisionNumber}).success(function(data){
      return data;
    });
  } 

}]);
现在我在我的一个控制器中调用它,如下所示:

$scope.division = GetDivision.division(1);

但是,我的服务不太好。它不会返回http请求函数之外的值,因此数据不会到达调用它的控制器。如何从http请求和调用的函数中返回数据?

您需要了解不能从异步操作返回数据。当您尝试返回数据时,响应根本不可用。通常在Javascript中,您会使用回调或承诺模式。事实上,承诺是一个非常自然的选择

app.service("GetDivision", ["$http", function($http) {
  this.division = function(divisionNumber){
    return $http.post("/api/division", {division:divisionNumber}).success(function(data){
      return data;
    });
  }
}]);
在控制器中:

GetDivision.division(1).then(function(data) {
    $scope.division = data;
});

确保您阅读了这个非常流行的主题:

您可以从服务返回空对象,并在收到响应后填充它。服务就是这样做的。它还允许避免控制器中的附加逻辑

这将起作用,因为对放入范围的
数据
对象的引用始终保持不变,并且
$http
服务在返回响应后开始摘要周期。因此,将立即检测到
范围.division
中的更改,并相应地更新视图

JavaScript

var app = angular.module('app',[]);

app.service("GetDivision", ["$http", function($http){

  var data = {};

  this.division = function(divisionNumber){
    $http.get("division", {division:divisionNumber}).success(function(responseData){
      angular.extend(data, responseData);
    });
    return data;
  } 

}]);

app.controller('ctrl', ['$scope', 'GetDivision', function ($scope, GetDivision) {
  $scope.division = GetDivision.division(1);
}]);
HTML

<body ng-controller="ctrl">
  <h1>{{division.text}}</h1>
</body>

{{division.text}

实时演示:

因为它是异步的,$scope在ajax调用完成之前获取数据。您可以在服务中使用$q来创建promise并将其返回给controller,controller将在针对promise的then()调用中获得结果。在您的服务中,@Rasalom您的示例也很好,只是有点多余,因为
$http.post()
已经返回了一个Promise对象,所以不需要再使用一个
$q.defer()
[newbie]是否可以从匿名
then
方法访问
$scope
?“我的意思是范围已经改变了,对吗?”格林先生,是的
$scope
对象来自外部作用域,所以它也可以在内部作用域中访问。@这就是我删除它的原因,不需要创建新的承诺,因为$http已经返回了一个。这也是一个有趣的想法。然而,我发现它非常令人困惑,因为它的工作原理并不明显(对于不熟悉摘要循环的初学者来说)。同时,适当的承诺用法使它变得清晰,并且在非角度世界中也会起作用,因为这只是承诺模式。但是好主意!