Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在angularJS中解析两个承诺后调用函数,一个使用另一个的结果_Javascript_Angularjs_Promise - Fatal编程技术网

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;
    })
};