for循环应该如何等待它内部的函数在angularjs中完成执行?

时间:2017-11-11 21:25:48

标签: javascript angularjs

我有一个数组$scope.requisition,里面有三个元素,对于每个元素,我正在执行一些任务(api调用并获取一些数据),但我得到的输出是“item1” “item1”“item1”“item2”“item2”“item2”不同步。我想要的是循环等待api获取数据,然后进行下一次没有发生的执行。

预期的输出是:

  • 第一次执行(“item1”“item2”)
  • 第二次执行(“item1”“item2”)
  • 第3次执行(“item1”“item2”)
for(var index in $scope.requisition){
    var tableName = JSON.parse($scope.requisition[index].applyFormConfig).table;
    console.log("item1 "+JSON.stringify($scope.requisition[index]));

    privateMetadata.getCustomFieldNames({entityName:tableName}).$promise.then(function(results) {
        $scope.target.tableFields = normalizeObjects(results);
        console.log("item2 "+JSON.parse($scope.requisition[index].applyFormConfig).items);
        angular.forEach(JSON.parse($scope.requisition[index].applyFormConfig).items,function(item){
            var mappedJsonObj = getObjectByIdFromArray(item.id, $scope.target.tableFields);
        });
    });
}; 

我是这个框架的新手,所以我不知道该怎么做。

1 个答案:

答案 0 :(得分:0)

Promise是异步的,但你可以通过创建一个计数器变量并将你的promise放在一个成功递归调用自身的函数中,然后递增计数器直到达到最后一个索引来解决这个问题。 片段:

var index = 0;
$scope.myFunction = function(){
    var tableName = JSON.parse($scope.requisition[index].applyFormConfig).table;
    console.log("item1 "+JSON.stringify($scope.requisition[index]));

    privateMetadata.getCustomFieldNames({entityName:tableName}).$promise.then(function(results) {
        $scope.target.tableFields = normalizeObjects(results);
        console.log("item2 "+JSON.parse($scope.requisition[index].applyFormConfig).items);
        angular.forEach(JSON.parse($scope.requisition[index].applyFormConfig).items,function(item){
            var mappedJsonObj = getObjectByIdFromArray(item.id, $scope.target.tableFields);
        });
        if(index!=$scope.requisition.length - 1){
            index++;
            $scope.myFunction();
        }
    });
}