角度服务中的函数延迟返回数据?

时间:2015-09-18 15:16:37

标签: javascript angularjs

我有一个服务,其中包含一个设置和返回默认用户首选项的功能。我遇到一个奇怪的问题,我认为这与返回数据的异步性质有关。我会告诉你电话,然后解释问题。

服务定义如下:

var StateService = angular.module('StateService', [])
.service('HoldState', function ($http, $q) {

在app.js中我有以下注射:

var JBenchApp = angular.module('JBenchApp', [
    'ngRoute',
    'StateService'
]);

在控制器中我也有以下注射:

JBenchApp.controller('CaseListCtrl', ['$scope', '$http', 'HoldState', 
  function ($scope, $http, HoldState) {

以下是我打电话的功能:

this.getUserDefaults = function (UserID) {
        var userDefaults = [], deferred = $q.defer();
        $http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
            .then(function (response) {
                userDefaults = response;
                //var status = getStatus();
                var status = localStorage.getItem('Status');

                // If the status is 0 then we have not yet navigated anywhere so we will need to set the path values to be
                // the same as the default. We do nothing if status is not 0 because it means we already have path values set
                if (status == 0 || status == null) {
                    /**setTypeOfLaw(response.LitigationCode);
                    setCourthouse(response.LocID);
                    setDepartment(response.CourtRoom);**/
                    localStorage.setItem('LawType', response.LitigationCode);
                    localStorage.setItem('Building', response.LocID);
                    localStorage.setItem('Dept', response.CourtRoom);
                    localStorage.setItem('Status', 1);
                }
                alert("value: " + userDefaults.PreferenceID);
                deferred.resolve(response);
            }, function (response) {
                console.log(response.status + " -- " + response.data + " -- " + response.statusText);
            });


        return deferred.promise;
    };

以下是我看到这个奇怪问题的代码:

$scope.fillDefaults = function () {
          HoldState.getUserDefaults('dpeng').then(function (data) {
              $scope.userDefaults = data;
              //$scope.$apply();
          });


      }

$scope.fillDefaults();

我看到的问题是调用并输入了该函数。然后处理返回到$ scope.userDefaults行,但它结束未定义。似乎代码在返回数据之前通过$ scope.fillDefaults函数。我怀疑这是因为警报错误说它无法找到未定义的属性PreferenceID。我通过PostMan检查了API调用,它工作得很好。我在这里做错了什么?

1 个答案:

答案 0 :(得分:0)

fillDefaults是一只红鲱鱼;问题出在getUserDefaults:您将http.get的完整回复对象分配给userDefaults,而不是回复数据。

$http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
            .then(function (response) {
                userDefaults = response;

应该是

$http.get('http://10.34.34.46/BenchViewServices/api/UserPreference/Default/' + UserID)
        .then(function (response) {
            userDefaults = response.data;