来自Angularjs工厂的回调

时间:2016-08-27 16:19:07

标签: javascript angularjs angularjs-factory

我想从工厂收到回电。如果我理解正确,回调应该在最深的嵌套函数中(即在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;
    }); 
});

2 个答案:

答案 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

如果您有任何疑问,请告诉我今天遇到类似问题并以此方式修复