AngularJS:从控制器调用服务功能时出错

时间:2017-10-06 15:40:58

标签: javascript angularjs

我将在这里描述的错误似乎很常见;我在网上看了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是AngularJS的新手。

我设计了一个服务,它有一个功能,其唯一的角色是检索资源并将其返回:

myApp.service('htmlGettersService', function ($http, $sce, $q) {
    this.getHtmlIsa = function (codice_isa) {
        return {
            console.log("Get HTML Isa...");

            var req = {
                method: 'GET',
                url: '/' + appName + '/api/quadri/' + codice_isa,
                headers: {
                    'Content-Type': 'text/html;charset=UTF-8'
                }
            };

            var htmlQuadri = {};
            var deferred = $q.defer();

            $http(req).then(function (response) {
                htmlQuadri = $sce.trustAsHtml(response.data);
                console.log("HTML Isa acquisito correttamente");
            }, function (response) {
                console.log("Errore in Get HTML Isa..." + response.message);
                htmlQuadri = ("Errore in Get HTML Isa..." + response.message).promise;
            });

            deferred.resolve(htmlQuadri);

            console.log("Exit from service function");
            //          return htmlQuadri;
            return deferred.promise;

        };

    }
});

在这种情况下,我必须插入延迟策略,因为服务功能似乎在GET调用(以及成功/失败功能)完成工作之前终止。 其次,我试图从控制器调用服务功能:

 $scope.getHtmlIsa = function () {

    htmlGettersService.getHtmlIsa($scope.codice_isa).then(function (response) {
        $scope.htmlQuadri = response.data;
    });

    console.log("Controller: exit from getHtmlIsa");
}

最后,我收到以下错误:

angular.js:14525 TypeError: Cannot read property 'then' of undefined
    at ChildScope.$scope.getHtmlIsa (quadriController.js:51)
    at Object.<anonymous> (quadriController.js:120)
    at Object.invoke (angular.js:5003)
    at $controllerInit (angular.js:10866)
    at nodeLinkFn (angular.js:9746)
    at compositeLinkFn (angular.js:9055)
    at publicLinkFn (angular.js:8920)
    at Object.link (angular-route.js:1223)
    at angular.js:1346
    at invokeLinkFn (angular.js:10426) "<ng-view class="ng-scope">"

我也尝试使用相同的推迟策略insiede控制器;上面报告的错误消失了,但似乎控制器函数在服务函数返回任何内容之前终止,因此没有足够的时间来保存控制器变量内的服务响应。 任何线索? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

this.getHtmlIsa应该返回Promise以便在控制器中解析它(a.e. .then()

但是在你的情况下,你返回的对象返回Promise并且语法错误:

 return {
  //...       
  return deferred.promise;
  }

肯定不是你想做的事

使用deferred也是不好的做法。请阅读此deferred antipattern

所以正确的语法应该是这样的:

myApp.service('htmlGettersService', function($http, $sce, $q) 
{
    this.getHtmlIsa = function(codice_isa)
    {
            console.log("Get HTML Isa...");

            var req = 
            {
                    method: 'GET',
                    url: '/'+appName+'/api/quadri/' + codice_isa,
                    headers: 
                    {
                        'Content-Type': 'text/html;charset=UTF-8'
                    }
            };

            var htmlQuadri = {};           

            return $http(req).then(function(response){
                htmlQuadri = $sce.trustAsHtml(response.data);
                console.log("HTML Isa acquisito correttamente");
                return htmlQuadri;
            }, function(response){
                console.log("Errore in Get HTML Isa..."+response.message);
                htmlQuadri = ("Errore in Get HTML Isa..."+response.message).promise;
                 return htmlQuadri;
            });           
    }
});