如何在.then中的循环内使用函数?

时间:2017-02-08 20:28:48

标签: javascript angularjs restangular

我有一个使用Restangular访问数据库的Angularjs项目。我有三层数据(比如mydata,mysubdata,mysubsubdata),每层之间有一对多的关系。我的问题是,对于我的显示器,我需要将mysubsubdata连接到mysubdata。当我试图从数据库中获取数据时,我在编译器中投诉说我不能在循环中使用函数。这是我想要做的:

DataService.one(mydata.id).getList('mysubdata')
.then(function(data) {
   var dataList = data;
   for (returnedData in dataList) {
     DataService.one(mydata.id).one('mysubdata',returnedData.id).getList('mysubsubdata')
    .then(returnedSubData) {
       dataList = angular.extend(dataList, returnedSubData);
    });
  }
});

我发现的所有示例都在.then函数中包含循环,或者首先尝试获得一堆承诺。我不认为这些适用。我对Angular来说还是一个新手,所以我可能会有点畏缩。也不确定延伸,但这可能是一个单独的问题。

编辑:我怀疑这应该用$ q.all来完成,但还没有掌握这个方法。

2 个答案:

答案 0 :(得分:0)

在循环中添加then()方法将不起作用,因为循环不等待promises被解析的简单原因。您可以使用递归方法实现此目的。

var myCustomData = null,
    dataList = null,
    dataListCounter = 0;

DataService.one(mydata.id).getList('mysubdata')
  .then(function (data){
     dataList = data;
     myCustomData = mydata;
     $scope.getSubSubData();
});

$scope.getSubSubData = function () {
   if (dataList.length >= dataListCounter)
     return;
   DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata')
     .then(function (returnedSubData) {
        dataList = angular.extend(dataList, returnedSubData);
        dataListCounter++;
        $scope.getSubSubData();
   });
};

请告诉我这是否有帮助!

答案 1 :(得分:0)

@Anadi Sharma的回应略有改动。

$scope.getSubSubData = function () {
   if (dataList.length == dataListCounter)
     return;
   DataService.one(myCustomData.id).one('mysubdata',dataList[dataListCounter].id).getList('mysubsubdata')
     .then(function (returnedSubData) {
        dataList[dataListCounter].mysubsubdata = returnedSubData;
        dataListCounter++;
        $scope.getSubSubData();
   });
};

请注意,当我显示数据以连接子数据值时,我会使用过滤器。