我有一个控制器调用服务方法。在该服务方法内部有一个AJAX调用。在AJAX调用的成功中,我正在调用一个不同的服务方法,该方法具有递归的AJAX调用,具体取决于AJAX响应的结果。我想要的是在我的控制器中检索递归AJAX调用的FINAL结果。 (见底部更新代码)
控制器:
app.controller('myController', function($scope, myService) {
$scope.getResults = function(){
myService.lookup().then(function(data){
console.log(data); //This returns just the 'lookup' data, but I want the final AJAX results of the recursive 'lookupUUID' service method here
});
}
$scope.getResults();
});
服务
app.service('myService', function() {
var self = this;
//This one is recursive
self.lookupUUID = function(lookupData){
$.get('/another/url/here', function (data){
if(!data[1]){
self.lookupUUID(data);
} else {
return data;
}
}, 'json'
)
}
self.lookup = function(){
$.get('/some/url/here', function (data){
if(!data[1]){
return self.lookupUUID(data);
} else {
return data;
}
}, 'json'
);
}
});
目前在我的控制器中,我只是从服务的data
方法接收原始AJAX调用中的lookup
。
更新后的代码:
控制器:
app.controller('myController', function($scope, myService) {
$scope.getResults = function(){
myService.lookup().then(function(data){
console.log(data);
});
}
$scope.getResults();
});
服务
app.service('myService', function($http) {
var self = this;
//This one is recursive
self.lookupUUID = function(lookupData){
return (
$http.get('/another/url/here', function (data){
if(!data[1]){
return self.lookupUUID(data);
} else {
return data;
}
}, 'json'
) //end of GET
); //end of return
} //end of self.lookupUUID
self.lookup = function(){
return (
$http.get('/some/url/here', function (data){
if(!data[1]){
return self.lookupUUID(data);
} else {
return data;
}
}, 'json'
) //end of GET
); //end of return
} //end of self.lookup
});
不幸的是,这仍然不会返回lookupUUID
递归方法的最终结果。我从第一个AJAX lookup
方法中获取了数据。
答案 0 :(得分:1)
我实际上收到了控制台错误:
"TypeError: Cannot read property 'then' of undefined"
。在我的控制器的.then
行
在功能层次结构的每个级别返回非常重要。
self.lookup = function(){
//
//return the promise
return (
$http.get('/some/url/here').then(function onSuccess(response){
//return data to the success handler
return response.data;
});
);
}
由于未能返回值lookup
函数,该函数返回undefined
,当然缺少.then
属性。
答案 1 :(得分:0)
您正在返回解析数据,然后您无法使用.then方法,而是返回promise,而您使用的是没有then方法的jquery。使用$ http代替具有then方法的,你可以返回promise。
注意: - 返回self.lookupUUID(数据); on!数据并不是一个好主意,而是返回即将发生的事情并在控制器中进行检查。
app.service('myService', function($http) {
var self = this;
//This one is recursive
self.lookupUUID = function(lookupData){
return $http.get('/another/url/here', function (data){
return data;
})
}
self.lookup = function(){
$http.get('/some/url/here', function (data){
if(!data[1]){
return self.lookupUUID(data);
} else {
return data;
}
});
}
});
<强>控制器强>
myService.lookup().then(function(data){
console.log(data);
},function(err){
console.log(err)
});
答案 2 :(得分:0)
感谢@georgeawg和SO Question/Answer的帮助,我已经能够找到解决方案。
<强>服务强>
self.lookupUUID = function(data, mode){
var lookupUuidPromise = $http.get('/another/url/here');
var p = lookupUuidPromise.then(function (response){
if(response.data[1] != 0){
return self.lookupUUID(response.data);
} else {
return response.data;
}
})
return p;
}
self.lookup = function(domain, mode){
var lookupPromise = $http.get('/some/url/here');
var p = lookupPromise.then(function(data){
if(data.data[1] != 0){
return self.lookupUUID(data.data, mode);
} else {
return data.data;
}
});
return p;
}
答案 3 :(得分:-1)
这是使用$ q service:(https://docs.angularjs.org/api/ng/service/ $ q)
完成的var deffered = $q.defer();
$timeout(function() {
$timeout(function() {
$timeout(function() {
deffered.resolve({test : 'value'})
}, 10)
}, 10)
}, 10);
return deffered.promise;
P.S。除非你知道100%需要使用它,否则不要在角度使用jquery。使用$ .get代替$ http服务很奇怪。