【问题标题】:When calling a function that returns a function that returns a function, how do you get data at the bottom?当调用返回函数的函数返回函数时,如何获取底部的数据?
【发布时间】:2014-12-07 08:04:52
【问题描述】:

如何在我返回的函数内部访问函数内部的数据?

projectsRsrc.factory('projectsSrvc', ['$resource', function($resource){

    return function(name){
        var url = "http://localhost/proj/v3/apiSimulations/projects.json"; 
        var resource = $resource(url);
        return resource.get(function(data){
            return data;
        });
    }
}]);

我想在我的控制器中获取这些数据。

projectsApp.controller('projectsCtrl', ['$scope', 'projectsSrvc', function($scope, projectsSrvc){

    $scope.projects = projectsSrvc(name);
}

但是projectsSrvc 返回一个函数,我不确定如何访问它返回的函数。最终我希望在我的控制器中分配data

【问题讨论】:

    标签: javascript function callback


    【解决方案1】:

    您的工厂返回一个函数并且该函数返回一个 promise 所以在您的控制器中您的代码应该是这样的:

    projectsSrvc(name).then(function(data) {
       $scope.projects = data;
    });
    

    编辑:我把 $resource 和 $http 混在一起了,所以事情看起来有点不同,但是这里解释了一切:https://docs.angularjs.org/api/ngResource/service/$resource

    我通过将代码更改为:

    projectsSrvc(name).$promise.then(function(data) {
       $scope.projects = data;
    });
    

    在这里测试:http://jsbin.com/vepivacosa/1/edit?html,js,console

    【讨论】:

    • 我应该改变我的工厂吗?
    • 我仍然收到TypeError: undefined is not a function
    • 如果它有效并且满足您的所有要求,我看不出您应该更改它的理由。我唯一不明白的是,为什么你从不使用参数name
    • 它不起作用。 projectsSrvc(name) 似乎没有返回承诺。我在 URL 中使用的真实版本中使用了name
    • 工作!万分感谢!你是怎么想出来的??
    【解决方案2】:

    你只需要另一组括号

    $scope.projects = projectsSrvc(name)(argumentmustbepassedhereforthefunction);
    

    但是请注意,当您从异步的 ajax 调用返回时,您将需要一些回调类型的东西(或者可能是承诺?)。

    顺便说一句,上面的代码只是用于

    var func = projectsSrvc(name); // store the function reference
    $.scope.projects = func(argumentmustbepassedhereforthefunction);
    

    【讨论】:

    • 我收到TypeError: object is not a function
    猜你喜欢
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多