【发布时间】:2017-03-10 14:22:44
【问题描述】:
在一个控制器函数中,我做了一些操作:
- 获取有承诺的组织列表
- 在此承诺之后,我循环遍历它们中的每一个以提取一些数据并填充我的一些控制器属性。
- 其中一个操作是调用另一个 Promise 来收集附属于该组织的所有用户,其中包含一个循环来提取名称和其他内容。
- 当我得到所有这些信息时,每个组织都已被解析,其中的所有用户也是如此,我必须调用一个函数来更新我的视图。
我通过设置一些标志(orgParsed 和 usersParsed)让它工作,但我发现它是......代码耻辱。
我听说有一种方法可能是通过使用$q 来等待两个promise 以及它们的“then”中的循环在调用我的视图函数之前解决。但我很难应用此代码更改,因为第二个承诺使用第一个承诺的结果来收集组织 ID。
这是我当前的代码:
this.getOrgData = function () {
return Service.getList().then(function (result) {
var orgCount = result.Objects.length;
var orgParsed = 0;
_.forEach(result.Objects, function (org) {
org.Users = [];
// Some logic here using 'org' data
Service.getUsers(org.Id, 0, 0).then(function (userResult) {
usersParsed = 0;
_.forEach(userResult.Objects, function (user) {
// Some Logic here using 'user.Name'
usersParsed++;
});
orgParsed++;
if (orgParsed === orgCount && usersParsed === userResult.Objects.length) {
self.sortMenuList(); // My view Function
}
});
});
$scope.$broadcast("getOrgData");
});
};
只有当我可以确定每个公司的所有用户都以更优雅/高效/安全的方式解析时,您是否看到任何触发我的 self.sortMenuList() 函数的方法?
【问题讨论】:
-
您需要
usersParsed做什么?doneUsers是什么? -
$q.all() 是等待多个端点调用结果的角度方式
-
doneUsers 是一个错误。问题已更正。
标签: javascript angularjs promise