Angular promises 在开始执行 then 而不是在所有其他承诺之后

Angular promises executing then in the beginning and not after all other promises

下面的代码没有抛出语法错误,但是在查询所有列表之前首先执行在数据表上呈现数据的 THEN 语句

此代码的意图是什么,有许多名称相似的共享点列表:Bill Cycles、Bill Cycles Archive1....N.

我需要针对特定​​查询查询所有这些列表,并将所有这些列表的结果连接到结果变量中,然后使用该变量和数据表插件进行呈现,但正如第一个语句中所解释的那样,外部.then在开头执行。

function GetData(billCycleId, clientCode, jobCodes, engagementCode) {
    var deferred = $q.defer();
    var enhanceFunctions = [
        function(searchResultRow) {
            return spService.AddHyperLinkOnFields(searchResultRow, config.HyperLinks);
        },
        function(searchResultRow) {
            return spService.AddPresenceOnFields(searchResultRow, config.UserFields);
        },
        function(searchResultRow) {
            return spService.FormatDateFields(searchResultRow, config.DateFields, generalConfig.DateTimeFormat);
        },
        function(searchResultRow) {
            return spService.AddImageMapping(searchResultRow, config.ImageFields);
        },
        function(searchResultRow) {
            return spService.FormatNumberFields(searchResultRow, config.NumberFields);
        }
    ];

    var selectProperties = spService.TransformFieldsToSelectProperties(config.Fields); 
    var extendedSelectProperties = selectProperties.slice(); // copy array
    var hyperLinkedProperties = spService.TransformFieldsToSelectProperties(config.HyperLinks)
    extendedSelectProperties = extendedSelectProperties.concat(hyperLinkedProperties);
    var result =[];
    spService.GetAllListsFromWeb()
    .then(function (lists) {
      var listEnumerator = lists.getEnumerator();
      return $q.all(
        (function(){
          //var promises = [];
          while (listEnumerator.moveNext()) {
            var oList = listEnumerator.get_current();
            var title = oList.get_title();
            var id = oList.get_id();
            if (title.indexOf('Bill Cycles') !== -1) {
              // Get data from SP !!! this is also async and returns a promise
              //   add the promise to promises array and wait for all to finish
              //   look above in Promise.all
              //promises.push(
                GetRelatedBillCyclesFromList(
                  id, 
                  extendedSelectProperties, 
                  billCycleId, 
                  clientCode, 
                  jobCodes, 
                  engagementCode, 
                  enhanceFunctions
                )
                .then(function (data) {
                  var trimmedData = 
                    spService
                    .SpSearchQuery
                    .TrimSearchResultsToSelectProperties(
                      data, 
                      selectProperties
                    );

                    trimmedData.forEach(function(item){ // loop over source array
                        result.push(item); //append to result array
                    });
                })
              //);
            }
          }
          //return promises
        })() //IIFE returning an array of promises
      );
    })
    .then( //The promise is used to execute something after all promises are resolved, but the results are build in the result array, no need to use data
      function(data){
        //var resultadata = data;
        var dataTable = $(tableSelector).DataTable();
        dataTable.clear().rows.add(result).columns.adjust().draw(); // Resize columns based on new data sizes              
        vm.ValidDataLoaded = true;    
      }
    );

}

更新 1

function GetData(billCycleId, clientCode, jobCodes, engagementCode) {
                    var deferred = $q.defer();
                    var enhanceFunctions = [
                        function(searchResultRow) {
                            return spService.AddHyperLinkOnFields(searchResultRow, config.HyperLinks);
                        },
                        function(searchResultRow) {
                            return spService.AddPresenceOnFields(searchResultRow, config.UserFields);
                        },
                        function(searchResultRow) {
                            return spService.FormatDateFields(searchResultRow, config.DateFields, generalConfig.DateTimeFormat);
                        },
                        function(searchResultRow) {
                            return spService.AddImageMapping(searchResultRow, config.ImageFields);
                        },
                        function(searchResultRow) {
                            return spService.FormatNumberFields(searchResultRow, config.NumberFields);
                        }
                    ];

                    var selectProperties = spService.TransformFieldsToSelectProperties(config.Fields); 
                    var extendedSelectProperties = selectProperties.slice(); // copy array
                    var hyperLinkedProperties = spService.TransformFieldsToSelectProperties(config.HyperLinks)
                    extendedSelectProperties = extendedSelectProperties.concat(hyperLinkedProperties);
                    var result =[];
                    spService.GetAllListsFromWeb()
                    .then(function (lists) {
                      var listEnumerator = lists.getEnumerator();
                      return $q.all(
                        (function(){
                          var promises = [];
                          while (listEnumerator.moveNext()) {
                            var oList = listEnumerator.get_current();
                            var title = oList.get_title();
                            var id = oList.get_id();
                            if (title.indexOf('Bill Cycles') !== -1) {
                              // Get data from SP !!! this is also async and returns a promise
                              //   add the promise to promises array and wait for all to finish
                              //   look above in Promise.all
                              promises.push(
                                GetRelatedBillCyclesFromList(
                                  id, 
                                  extendedSelectProperties, 
                                  billCycleId, 
                                  clientCode, 
                                  jobCodes, 
                                  engagementCode, 
                                  enhanceFunctions
                                )
                                .then(function (data) {
                                  var trimmedData = 
                                    spService
                                    .SpSearchQuery
                                    .TrimSearchResultsToSelectProperties(
                                      data, 
                                      selectProperties
                                    );

                                    trimmedData.forEach(function(item){ // loop over source array
                                        result.push(item); //append to result array
                                    });
                                })
                              );
                            }
                          }
                          //return promises
                        })() //IIFE returning an array of promises
                      );
                    })
                    .then( //The promise is used to execute something after all promises are resolved, but the results are build in the result array, no need to use data
                      function(data){
                        //var resultadata = data;
                        var dataTable = $(tableSelector).DataTable();
                        dataTable.clear().rows.add(result).columns.adjust().draw(); // Resize columns based on new data sizes              
                        vm.ValidDataLoaded = true;    
                      }
                    );

                }

问题是你的 (function(){ 没有 return 承诺。实际上,它 return 没什么。

但是您评论的代码是正确的解决方案。你创建了一个承诺数组,然后你使用 $q.all(promises).then(function(){data}...)