Javascript AngularJS:从控制器调用服务函数时出错

Javascript AngularJS:从控制器调用服务函数时出错,javascript,angularjs,Javascript,Angularjs,我将在这里描述的错误似乎很常见;我在网上读了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是AngularJS新手 我设计了一个服务,它的唯一作用是检索资源并返回它: myApp.service('htmlGettersService', function ($http, $sce, $q) { this.getHtmlIsa = function (codice_isa) { return { console.log

我将在这里描述的错误似乎很常见;我在网上读了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是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调用(以及success/failure函数)完成工作之前终止。 其次,我尝试从控制器调用服务函数:

 $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">"
angular.js:14525类型错误:无法读取未定义的属性“then”
在ChildScope.scope.getHtmlIsa(quadriController.js:51)
反对。(quadriController.js:120)
在Object.invoke(angular.js:5003)
在$controllerInit(angular.js:10866)
在nodeLinkFn(angular.js:9746)
在复合线kfn(angular.js:9055)
在publicLinkFn(angular.js:8920)
在Object.link(angular route.js:1223)
在angular.js:1346
在invokeLinkFn(angular.js:10426)”处
我也尝试在赛德控制器中使用同样的延迟策略;上面报告的错误消失了,但似乎控制器函数在服务函数返回任何内容之前终止,所以没有足够的时间将来自服务的响应保存在控制器变量中。 有线索吗?
感谢您的帮助。

此。getHtmlIsa
应返回承诺,以便在控制器中解决此问题(即
.then()

但是,在您的情况下,您返回的对象返回的Promise语法也错误:

 return {
  //...       
  return deferred.promise;
  }
当然这不是你想做的


另外,使用
延迟
也不是好的做法。请看这个

因此,正确的语法应该是:

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;
            });           
    }
});

您的代码无法读取,抱歉,谢谢您的回答。我读了很多关于使用外部回报的帖子:有些人使用,有些人不使用。一开始我没有用过它,后来我又加上了它,因为我已经看过很多次了。因为我是AngularJS的新手,所以我对语法有很多疑问。你能明确地告诉我我错在哪里吗?@Bia我想你混淆了
工厂的语法:)这里我们谈论
服务
方法对不起,这篇乱七八糟的帖子,我在工作中被分配了一项任务,我没有时间好好学习这个主题(书籍、示例、教程、练习)。我会利用你的建议,让你知道