2016-04-15 56 views
0

我希望这只是一个愚蠢的事情,我忽略或不正确地做,因为它是在杀我。角度服务承诺和lodash创建空对象

这是一个角度控制器的一部分,该角度控制器基于已知的管理员ID为一组销售代表轮询数据库(Parse)。

第一部分检查管理器状态并返回组memberId's。

然后根据生成的memberId对另外的组成员进行另一次检查。因此,有一组顶级经理和一组managerId,每个都有一个子组中的销售代表。

这里所有的东西都检查出来了(它可能不是最有效的方法,但它可以工作......现在 - 有时候我不会编写整个应用程序,我会重做它)。

注意... LoggingService只是一个奇特的console.log输出。

问题出在最后的承诺返回变量... managerGroup。

最终LoggingService.info(' - > managerGroup',managerGroup)();的输出。是正确的,它也是输出到$ scope.pageData。如下:

Object 
    managerId: "sL0lGF3sYw" 
    groupMembers: Array [2] 
    0: Object 
     managerId: "fytsi64nkp" 
     salesGroup: false 
    1: Object 
     managerId: "gcMIA9xnn0" 
     salesGroup: Array [3] 
     0: "6MunY0xGvp" 
     1: "9O4ly8Coyw" 
     2: "K67ZSUsE0q" 

这是一直在压抑我的大脑的部分。如果我在managerGroup.groupMembers上运行日志,结果是:

["fytsi64nkp", "gcMIA9xnn0"] 

也许这是我的代码,也许我错过了一些东西。

var ClientAccess = Parse.Object.extend('ClientAccessLU'); 
    var query   = new Parse.Query(ClientAccess); 

    query.equalTo('managerId', userId); 

    query.first().then(function(results) { 
     // check for manager status 
     if (results) { 
      LoggingService.info('user is manager', results)(); 
      $rootScope.managerFlag = true; 
      // returns the current user managerID and group members 
      return results.attributes; 
     } else { 
      LoggingService.warn('user is not a manager')(); 
      $rootScope.managerFlag = false; 
      return false; 
     } 
    }).then(function(managerData) { 
     // create a default managerGroup 
     var managerGroup = { 
      'managerId': managerData.managerId, 
      'groupMembers': managerData.salesRepIds 
     }; 

     // check if members are managers of additional groups and build the inner group 
     lodash.each(managerGroup.groupMembers, function(member, index){ 
      UserLU.getGroupMembers(member).then(function(innerGroup){ 
       // add the innerGroup member id's to the main group 
       managerGroup.groupMembers[index] = { 
        'managerId': member, 
        'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
       }; 
      }); 
     }); 
     return managerGroup; 
    }).then(function(managerGroup){ 
     // then check the innermost group for client sales data as these members are sales reps 
     LoggingService.info('-> managerGroup', managerGroup)(); 



     $scope.pageData = managerGroup; 
    }); 

任何帮助表示赞赏......谢谢。

+0

'managerGroup.groupMembers'是数组还是对象? – kiro112

+0

@ kiro112它是一个数组 – orderofout

回答

0

使用Promise而不是lodash.each

Promise.all(managerGroup.groupMembers, function (member, index) { 
    return UserLU.getGroupMembers(member) 
     .then(function(innerGroup){ 
      // add the innerGroup member id's to the main group 
      return member = { 
       'managerId': member, 
       'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
      }; 
     }); 
}).then(function (managerGroupMembers) { 
    managerGroup.groupMembers = managerGroupMembers; 

    return managerGroup; 
}); 
+0

我喜欢这个想法,但我认为它不会像现在这样工作... lodash位已经在承诺链中运行了 - Promise.all不应该是可靠的。也许我太过于复杂了。但我想限制我的嵌套承诺。 – orderofout

+0

即使它不能与我的代码一起工作,我仍然认为这是正确的,因为这是另一个链接诺言中的链接承诺,它只是不起作用......但是,您肯定已通知我为什么我得到我收到的答复,所以这是一个解决方案。我只需要重写我的代码就可以工作。 – orderofout

0

按照我所审核,对managerGroup.groupMembers记录你所得到的

var managerGroup = { 
      'managerId': managerData.managerId, 
      'groupMembers': managerData.salesRepIds 
     }; 

输出作为异步你是下面的代码运行在你完成这段代码之前去下一个。

lodash.each(managerGroup.groupMembers, function(member, index){ 
      UserLU.getGroupMembers(member).then(function(innerGroup){ 
       // add the innerGroup member id's to the main group 
       managerGroup.groupMembers[index] = { 
        'managerId': member, 
        'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
       }; 
      }); 
     }); 

希望这可以帮助你。

+0

在lodash有时间回来之前,我正在进行下一个承诺 - 这就是为什么@ kiro112建议使用Promise ...这是有道理的。 – orderofout