javascript - 在循环中调用异步递归函数并在angularjs中获取结果

标签 javascript angularjs asynchronous angular-promise deferred

由于一个奇怪的API,我需要在循环中调用异步递归函数并在AngularJS中获取结果。以下是我的情况的示例。

我们有任务列表,每个任务可能没有,一个或多个子任务 每个子任务还可以没有、一个或多个子任务 我需要在单个对象数组中获取所有任务和子任务 问题是为了获取任务的子任务列表,我们需要调用异步API。 由于 API 本质上是异步的,我无法获得所有结果

 //We have task lists
allTasks = fromSomeOtherFuncion();
$scope.loadSubTask = function () {
        var deferred = $q.defer();
        for (var j = 0; j < allTasks.length; j++) {

            for (var k = 0; k < allTasks[j].subtasks.length; k++) {
                $scope.fetchTaskByTaskID(allTasks[j].subtasks[k].id, deferred);
            }
        }
        return deferred.promise;
    };

    $scope.fetchTaskByTaskID = function (id, deferred) {
        if (!deferred) {
            deferred = $q.defer();
        }
        var client = window.client;
        client.tasks.findById(id, {
            opt_fields: 'id,name,memberships,subtasks',
        }).then(function (response) {

            if (response.subtasks.length > 0) {
                for (var m = 0; m < response.subtasks.length; m++) {
                    $scope.fetchTaskByTaskID(response.subtasks[m].id, deferred);
                }
            }
            else {
                deferred.resolve(response);
                return deferred.promise;
            }
        });
    };

//Then I called the function
 $scope.loadSubTask().then(function (subtasks) {
                        //I need here all Tasks+SubTasks+SubSubTasks..., which I am not getting


                    });

最佳答案

您需要保留 j 和 K 的值。您可以这样做:

$scope.loadSubTask = function () {
        var deferred = $q.defer();

        for (var j = 0; j < allTasks.length; j++) {
         (function(j){

            for (var k = 0; k < allTasks[j].subtasks.length; k++) {
               (function(k){

                $scope.fetchTaskByTaskID(allTasks[j].subtasks[k].id, deferred);
             })(k)
            }
         })(j)
        }
        return deferred.promise;
    };

You can also use let instead of var. It will be the most cleaner way,

关于javascript - 在循环中调用异步递归函数并在angularjs中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47179665/

相关文章:

node.js - 我应该使用 process.nextTick

javascript - Google Cloud Vision (Chrome) 结果限制为 5

javascript - 可扩展表 AngularJS

angularjs - 智能 : Automatically update resources

javascript - 更改重复的 $scope 数组,但它会影响原始的 ng-repeat

javascript - 直接对数据库操作执行等待将给出未定义的结果

c# - IAsyncEnumerable<T> 与 IEnumerable<Task<T>> 之间有什么区别?

javascript - 简单的js for循环只迭代一次

javascript - Google map 距离 API 在 React 中未定义

javascript - 如何通过 Props 提取路由参数