我将在这里描述的错误似乎很常见;我在网上看了很多页面(包括这个论坛上的一些帖子),但我没有找到任何解决方案,可能是因为我是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控制器;上面报告的错误消失了,但似乎控制器函数在服务函数返回任何内容之前终止,因此没有足够的时间来保存控制器变量内的服务响应。 任何线索? 谢谢你的帮助。
答案 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;
});
}
});