我想从工厂收到回电。如果我理解正确,回调应该在最深的嵌套函数中(即在var myResult = $filter('filter')(myData, {id:exnum})[0];
下,但我得到“TypeError:回调不是函数”。
我的工厂打电话给另一家工厂,得到一个价值并将其注入第三个工厂以获得最终结果。最终结果正确记录到控制台,但我无法回调到控制器。
任何反馈都将不胜感激。
angular.module('resourceFetch', [])
.factory('ResourceFetch', ['JsonService', 'UserProgress', '$filter', function(JsonService, UserProgress, $filter) {
var resourceResult = {};
resourceResult.getResource = function(callback){
UserProgress.getProgress(function(exnum, callback) {
JsonService.get(function(data){
var myData = [];
var myData = data.exercises;
var myResult = [];
var myResult = $filter('filter')(myData, {id:exnum})[0];
console.log(myResult) // <- this displays correctly
callback(myResult); // <- "TypeError: callback is not a function"
});
});
//callback(myResult); <- here "myResult is not defined"
};
return resourceResult;
}]);
这是控制器:
myApp.controller('ResourceFetchTest', function($scope, ResourceFetch) {
$scope.myresults = ResourceFetch.getResource(function(obj1){
console.log('obj1 is ' + obj1);
$scope.MyData = obj1;
$scope.MySelectedData = obj1.string1;
});
});
答案 0 :(得分:0)
抱歉,我之前的回答并未正确查看您的代码,您最大的问题是您尝试在服务中传递服务,这会使您的代码难以理解。
你应该做的是将所有服务注入你的控制器模块,然后你就可以做一些事情。
myApp.controller('ResourceFetchTest', function($scope, ResourceFetch) {
$scope.dataForProgress = "Bind whatever data in needed to get your progress";
$scope.dataForJson = UserProgress.getProgress(dataForProgress);
$scope.myResults = JsonService.get(dataForJson);
});
根据每项服务的作用以及它所调用的内容,您可能也会进行异步调用,在这种情况下,我建议您查看$ q指令的角度提供。
答案 1 :(得分:0)
您可以使用承诺来返回对象
类似的东西:
angular.module('resourceFetch', [])
.factory('ResourceFetch', ['JsonService', 'UserProgress', '$filter','$q', function(JsonService, UserProgress, $filter,$q) {
var resourceResult = {};
resourceResult.getResource = function(){
var defer = $q.defer();
UserProgress.getProgress(function(exnum) {
JsonService.get(function(data){
var myData = [];
var myData = data.exercises;
var myResult = [];
var myResult = $filter('filter')(myData, {id:exnum})[0];
console.log(myResult) // <- this displays correctly
defer.resolve(myResult);
});
});
return defer.promise;
};
return resourceResult;
}]);
并在控制器中:
myApp.controller('ResourceFetchTest', function($scope, ResourceFetch) {
$scope.myresults = ResourceFetch.getResource().then(function(obj1){
console.log('obj1 is ' + obj1);
$scope.MyData = obj1;
$scope.MySelectedData = obj1.string1;
});
});
这里有关于承诺的文档:https://docs.angularjs.org/api/ng/service/ $ q
如果您有任何疑问,请告诉我今天遇到类似问题并以此方式修复