角度服务承诺和lodash创建空对象
我希望这只是一个愚蠢的事情,我忽略或不正确地做,因为它是在杀我。角度服务承诺和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;
});
任何帮助表示赞赏......谢谢。
使用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;
});
我喜欢这个想法,但我认为它不会像现在这样工作... lodash位已经在承诺链中运行了 - Promise.all不应该是可靠的。也许我太过于复杂了。但我想限制我的嵌套承诺。 – orderofout
即使它不能与我的代码一起工作,我仍然认为这是正确的,因为这是另一个链接诺言中的链接承诺,它只是不起作用......但是,您肯定已通知我为什么我得到我收到的答复,所以这是一个解决方案。我只需要重写我的代码就可以工作。 – orderofout
按照我所审核,对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
};
});
});
希望这可以帮助你。
在lodash有时间回来之前,我正在进行下一个承诺 - 这就是为什么@ kiro112建议使用Promise ...这是有道理的。 – orderofout
'managerGroup.groupMembers'是数组还是对象? – kiro112
@ kiro112它是一个数组 – orderofout