Javascript 在angularJS中解析两个承诺后调用函数,一个使用另一个的结果
在控制器函数中,我执行一些操作:Javascript 在angularJS中解析两个承诺后调用函数,一个使用另一个的结果,javascript,angularjs,promise,Javascript,Angularjs,Promise,在控制器函数中,我执行一些操作: 获取有承诺的组织的列表 在这个承诺的最后阶段,我循环遍历它们中的每一个,以提取一些数据并填充一些控制器属性 其中一个操作是调用另一个承诺来收集连接到此组织的所有用户,其中有一个循环来提取名称和其他内容 当我得到所有这些信息时,每个组织都被解析了,在这些组织中也有所有用户,我必须调用一个函数来更新我的视图 我通过设置一些标志(orgParsed和usersParsed)使其工作,但我发现它是。。。可耻的行为 我听说有一种方法可以做到这一点,即使用$q等待两个承
- 获取有承诺的组织的列表
- 在这个承诺的最后阶段,我循环遍历它们中的每一个,以提取一些数据并填充一些控制器属性李>
- 其中一个操作是调用另一个承诺来收集连接到此组织的所有用户,其中有一个循环来提取名称和其他内容
- 当我得到所有这些信息时,每个组织都被解析了,在这些组织中也有所有用户,我必须调用一个函数来更新我的视图李>
orgParsed
和usersParsed
)使其工作,但我发现它是。。。可耻的行为
我听说有一种方法可以做到这一点,即使用$q
等待两个承诺,并在调用我的视图函数之前,在它们的“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()函数的方法吗?你所描述的问题听起来像是你想等待一定数量的承诺都得到解决,然后对结果进行处理。当您使用
Promise.all()
时,这非常容易:
是的,这个计数肯定应该被
$q.all
所取代,尤其是当您不需要处理任何错误时
this.getOrgData = function () {
return Service.getList().then(function (result) {
$scope.$broadcast("getOrgData"); // not sure whether you want that here before the results from the loop
return $q.all(_.map(result.Objects, function (org) {
org.Users = [];
// Some logic here using 'org' data
return Service.getUsers(org.Id, 0, 0).then(function (userResult) {
_.forEach(userResult.Objects, function (user) {
// Some Logic here using 'user.Name'
});
});
}));
}).then(function() {
self.sortMenuList(); // My view Function;
})
};
您需要
usersParsed
做什么?还有,doneUsers
?$q.all()是等待多个端点调用结果的一种特殊方式。OneUsers是一个错误。问题已更正。谢谢,非常有用,但我将使用$q.all
this.getOrgData = function () {
return Service.getList().then(function (result) {
$scope.$broadcast("getOrgData"); // not sure whether you want that here before the results from the loop
return $q.all(_.map(result.Objects, function (org) {
org.Users = [];
// Some logic here using 'org' data
return Service.getUsers(org.Id, 0, 0).then(function (userResult) {
_.forEach(userResult.Objects, function (user) {
// Some Logic here using 'user.Name'
});
});
}));
}).then(function() {
self.sortMenuList(); // My view Function;
})
};