Javascript AngularJs服务中从WebApi接收数据时出现问题

Javascript AngularJs服务中从WebApi接收数据时出现问题,javascript,angularjs,asp.net-web-api,angularjs-service,angular-promise,Javascript,Angularjs,Asp.net Web Api,Angularjs Service,Angular Promise,我将在我的应用程序中使用AngularJS服务,使一切都干净整洁。。为此,我看了一些文章。但它似乎还没有完成。对吧?? 我没有看到任何错误或东西,但当我设置警报(数据);我将得到未定义的错误。我错过的工作在这里做什么 我的App.js var app = angular.module('starter', ['ionic']) My Service.js var serverPath = 'http://url/api/locations'; app.service('testService

我将在我的应用程序中使用AngularJS服务,使一切都干净整洁。。为此,我看了一些文章。但它似乎还没有完成。对吧??
我没有看到任何错误或东西,但当我设置警报(数据);我将得到未定义的错误。我错过的工作在这里做什么

我的App.js

var app = angular.module('starter', ['ionic'])
My Service.js

var serverPath = 'http://url/api/locations';

app.service('testService', function($http) {
  this.getLocations = function() {
    $http.get(serverPath).success(function(data) {
      return data;
    });
  };
});
My controller.js

app.controller('LocationsController', function ($scope, testService) {
  $scope.locations = testService.getLocations();
});
还有我的用户界面

<div ng-controller="LocationsController">
  <ul>
    <li ng-repeat="location in locations">
      {{ location.locationName }}
    </li>
  </ul>
</div>

  • {{location.locationName}

一旦请求数据,就无法直接从异步调用中获取数据。您应该遵循promise模式来处理异步数据

我想指出你犯的几个错误

  • 您应该具有return
    $http.get
    promise from service method
    getLocations
    ,这样您就可以将
    函数置于该方法之上
    
  • 然后在控制器内部从控制器调用服务方法
    getLocations
    ,并放置
    。然后调用
    函数,其中第一个函数在ajax成功时调用,第二个函数在ajax错误时调用。
    
    的功能。然后

    this.getLocations = function () {
        return $http.get(serverPath); //return promise object
    };
    
  • 控制器

    testService.getLocations().then(function(response){ //success function
         $scope.locations = response.data;
    }, function(error){ //error function
         console.log("Some error occurred", error)
    });
    

    下面是我是如何做到这一点的,因为$http中有承诺

    我想在页面中添加一个初始化步骤

    内部服务:

    $http.get(serverPath)
      .success(function(data) {
        return data;
      })
      .error(function(err) {
        console.log("some error occured");
        return err;
      });
    
    控制器:

    app.controller('LocationsController', function($scope, testService) {
      $scope.init = function() {
        testService.getLocations()
          .success(function(res) {
            $scope.locations = res;
          })
          .error(function(err) {
            console.log("LocationsController, getLocations error:", err);
            // alert(err);
          });
      };
    });
    
    标记:

    <div ng-controller="LocationsController" ng-init="init()">
      <ul>
        <li ng-repeat="location in locations">
          {{ location.locationName }}
        </li>
      </ul>
    </div>
    
    
    
    • {{location.locationName}

    如果http调用需要一些时间,还可以添加ng hide

    您在哪里运行
    警报(数据)
    ?@gtlambert在我的位置控制器中。我删除了这一行。只有当服务实际返回承诺时,这一行才会起作用。不,.success()和.error()都返回额外链接的原始承诺。(你不应该再使用它们了,它们已经被弃用了。)@Dave我想你是在说,我在上面的回答中做了什么:我明白了<代码>$http.get('/someUrl',config.),然后(successCallback,errorCallback)我就把它放在那里。@MortezaAghili很高兴听到这个消息。。谢谢:)我可以将此方法用于post或put方法吗?@MortezaAghili您所说的
    是什么意思?让我检查一下,如果是错误,我将为您解释。再次感谢