来自 Angularjs 工厂的回调
Callback from Angularjs factory
我想得到工厂的回电。如果我理解正确,回调应该在最深的嵌套函数中(即在 var myResult = $filter('filter')(myData, {id:exnum})[0];
下,但我得到 "TypeError: callback is not a function".
我的工厂调用另一个工厂,获取一个值并将其注入第三个工厂以获得最终结果。这个最终结果正确地记录到控制台,但我无法回调到控制器。
如有任何反馈,我们将不胜感激。
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;
});
});
抱歉,我之前的回答没有正确查看您的代码,这里最大的问题是您试图在服务内传递服务,这让您的代码难以理解。
你应该做的是将你所有的服务注入你的控制器模块,然后你可以按照这个做一些事情。
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);
});
根据每个服务的作用和它调用的内容,您也可能进行异步调用,在这种情况下,我建议查看 angular 提供的 $q 指令。
您可以对 return 对象使用承诺
类似于:
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
如果您有任何疑问,请告诉我我今天遇到了类似的问题并以这种方式解决了它
我想得到工厂的回电。如果我理解正确,回调应该在最深的嵌套函数中(即在 var myResult = $filter('filter')(myData, {id:exnum})[0];
下,但我得到 "TypeError: callback is not a function".
我的工厂调用另一个工厂,获取一个值并将其注入第三个工厂以获得最终结果。这个最终结果正确地记录到控制台,但我无法回调到控制器。
如有任何反馈,我们将不胜感激。
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;
});
});
抱歉,我之前的回答没有正确查看您的代码,这里最大的问题是您试图在服务内传递服务,这让您的代码难以理解。
你应该做的是将你所有的服务注入你的控制器模块,然后你可以按照这个做一些事情。
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);
});
根据每个服务的作用和它调用的内容,您也可能进行异步调用,在这种情况下,我建议查看 angular 提供的 $q 指令。
您可以对 return 对象使用承诺
类似于:
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
如果您有任何疑问,请告诉我我今天遇到了类似的问题并以这种方式解决了它