来自 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

如果您有任何疑问,请告诉我我今天遇到了类似的问题并以这种方式解决了它