【问题标题】:calling asynchronous recursive function in loop and getting result in angularjs在循环中调用异步递归函数并在 angularjs 中获取结果
【发布时间】:2017-11-08 12:22:45
【问题描述】:

由于一个奇怪的 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


                    });

【问题讨论】:

  • 您没有在获得任务时聚合它们。当您循环遍历子任务或异步获取它们然后最终解析该数组时,请继续将它们推送到数组中。

标签: javascript angularjs asynchronous angular-promise deferred


【解决方案1】:

你需要保留 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;
    };

您也可以使用 let 代替 var。这将是最清洁的方式,

【讨论】:

  • 嗨,Ved,感谢您的建议。但我的问题没有得到解决。为了了解我的情况,我创建了 plunkr。当所有异步请求都被执行时,我需要回调。 plnkr.co/edit/6pZ6gHIbdg0tI02PAeIS
猜你喜欢
  • 1970-01-01
  • 2020-06-27
  • 2022-12-06
  • 2012-05-15
  • 1970-01-01
  • 2011-12-03
  • 2016-04-29
  • 1970-01-01
  • 2016-09-21
相关资源
最近更新 更多