【问题标题】:AngularJS factory with promises not working properly承诺无法正常工作的AngularJS工厂
【发布时间】:2018-03-02 01:22:07
【问题描述】:

我有一个 angularjs 工厂,我执行 $http.get 请求来获取 JSON 数据并进行比较。我尝试返回过滤后的列表,但它似乎不起作用。

    app.service('ScopeService', ['$http', '$q', function($http, $q){

var service = {};

  var permsList = [],
    codeMapping;
    
  var perms = {
    "admin": true,
    "dev": true,
    "qa": true,
    "audit": false,
    "general": true,
    "grp1": false,
    "grp2": false,
    "grp3": false,
    "grp4": false,
    "grp5": true,
    "env": "DEV",
    "version": "1.6.3"
  }

function mapping() {

    $http.get('./utils/codeMapping.json').then(function (response) {
codeMapping = response.data.codeMapping;

function findBU(BG) {
    return _.find(codeMapping, ['id', Name]).number
}

if (perms.grp1) {
    permsList = permsList.concat(findBU('A'));
}

if (perms.grp2) {
    permsList = permsList.concat(findBU('B'));
}

if (perms.grp3) {
    permsList = permsList.concat(findBU('C'));
}

if (perms.grp4) {
    permsList = permsList.concat(findBU('D'));
}

if (perms.grp5) {
    permsList = permsList.concat(findBU('E'));
}

if (perms.audit) {
    permsList = [];
}

$q.resolve(permsList);
});
}

service.getMapping = function() {
    return mapping();
};

service.getMapping().then(function(res) {
    console.log(res)
})
return service;
}]);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>

所以“外部”为我提供了我想要的数据,但它在 getMapping 函数中不起作用。

我认为这是因为在添加 getMapping 的值之前使用空对象调用服务的时间不匹配。

请帮忙。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    根据您提供的代码,很难判断您是如何使用它的。但是,您似乎没有返回一个承诺,而是返回一个数组对象。另外,我不确定你为什么在你的获取请求中链接另一个然后。试试这样的...

    在此处查看一个工作示例: http://jsfiddle.net/riegersn/rnd4ujfd/12/

    app.service('ScopeService', ['$http', '$q', function($http, $q) {
    
        var service = {};
    
        var permsList = [],
            codeMapping;
    
        var perms = {
            "admin": true,
            "dev": true,
            "qa": true,
            "audit": false,
            "general": true,
            "grp1": false,
            "grp2": false,
            "grp3": false,
            "grp4": false,
            "grp5": true,
            "env": "DEV",
            "version": "1.6.3"
        }
    
        service.getMappings = function() {
            return $http.get('https://jsonplaceholder.typicode.com/users/1').then(function(response) {
                /* manipulate your data */
                permsList.push('some data!');
                console.log(permsList);
                return $q.resolve(permsList);
            });
        }
    
        return service;
    }]);
    

    【讨论】:

    • 嗨,我试过了。删除了第二个 .then() 并做了你提到的。它说 service.getMapping() 不是一个函数。
    • 很难说你提供的代码有什么问题。
    • 所以,我将服务定义为顶部的一个空对象。当我创建一个名为 service.getMapping 的函数并尝试在函数内返回 mapping() 的值时,它会在立即调用时返回 undefined。承诺瀑布有效吗?
    • 进入我顶部的工厂。我可以更多地重构我的代码。将我的代码编辑为我当前的实现。
    • 看起来您从服务中删除了 getMapping 函数。
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 2016-09-05
    • 2014-09-27
    相关资源
    最近更新 更多