Ion-list not populated

Good morning,

in my application I need to show a list populated from a DB.

This is the code to get the remote data:

getServiziPerCategoria: function(nodo, codice, isWebView, isAndroid) {
        var serverAddress = window.localStorage['SERVER_ADDR'];
        var deferred = $q.defer();
        var promise = deferred.promise;
        
        if (isWebView && !isAndroid) {
          // Sovrascrivo l'indirizzo del server se sono su browser
          // e l'applicazione non viene eseguita da un dispositivo mobile,
          // perchè ho bisogno di un server proxy per risolvere
          // il problema del CORS: Cross-Origin Resource Sharing
          serverAddress = ApiEndpoint.url
        }
        
        // Verifico se il campo dell'indirizzo server è compilato          
        if (serverAddress && serverAddress != "") {
          return $http.post(serverAddress + '/url/' + codice, {
            "nodo": nodo
          }).success(function(response, status, headers, config) {
            // Faccio una verifica delle credenziali
            if (response.length > 0) {
              deferred.resolve(response);
            } else {
              deferred.reject(response);
            }
          }).error(function(response, status, headers, config) {
            deferred.reject(response);
          });
        } else {
          deferred.reject("Non hai ancora impostato l'indirizzo del server.");
        }
      }

and this is the code which call the service:

.controller('CreaComandaCtrl', function($scope, $state, $stateParams, $ionicLoading, CreaComandaService, UtentiStorage, $ionicPopup, Helpers) {
  $scope.data = {};
  outputData = [];
  
  var i = 0;
  var isWebView = ionic.Platform.isWebView();
  var isAndroid = ionic.Platform.isAndroid();
  var nodo = window.localStorage['NODO'];
  var flag = false;
  
  // Popup di caricamento
  $ionicLoading.show({template: 'Caricamento...'});
  
  $scope.isWebView = isWebView;
  $scope.isAndroid = isAndroid;
  
  $scope.utente = UtentiStorage.getUtente($stateParams.codice);
  
  $scope.groups = [];
 
  if (nodo == null) {
    $ionicLoading.hide();
    var alertPopup = $ionicPopup.alert({
      title: 'Nodo non impostato',
      subTitle: 'Verificare le impostazioni',
      template: '<div class="row"><div class="col text-center">Eseguire il logout e verificare le impostazioni</div></div>',
      buttons: [
        {
          type: 'button-assertive',
          text: 'OK'
        }
      ]
    });
  } else {
    CreaComandaService.getCategorie(nodo.toString(), isWebView, isAndroid).success(function(data) {
        CreaComandaService.getServiziPerCategoria(nodo.toString(), codice, isWebView, isAndroid).success(function(dataServ) {
        if (!Helpers.checkDuplicatedCategory(outputData, index)) {
          if (!Helpers.checkDuplicatedCategory(outputData, index)) {
            var obj = {name:descr, id:index, items:dataServ};
            outputData.push(obj);
            
            // chiamata ricorsiva di funzione
            if (index < (temp_data.length - 1)) {
              index += 1;
              getServiziPerCategoria(temp_data, index);
            } else {
              console.log("Store data");
              $scope.groups = outputData;
            }
          }
        }
      error(function(dataServ) {
        $ionicLoading.hide();
        var alertPopup = $ionicPopup.alert({
          title: 'Lettura aree fallita!',
          subTitle: 'Si è verificato un errore durante il caricamento delle aree',
          template: '<div class="row"><div class="col text-center">Per favore, controlla la connessione internet</div></div>',
          buttons: [
            {
              type: 'button-assertive',
              text: 'OK'
            }
          ]
        });
      });
    }).error(function(data) {
      $ionicLoading.hide();
      var alertPopup = $ionicPopup.alert({
        title: 'Lettura aree fallita!',
        subTitle: 'Si è verificato un errore durante il caricamento delle aree',
        template: '<div class="row"><div class="col text-center">Per favore, controlla la connessione internet</div></div>',
        buttons: [
          {
            type: 'button-assertive',
            text: 'OK'
          }
        ]
      });
    });
  }
})

The problem is that sometimes the list is populated, sometimes no.

Could you please explain me why?

Is because che http.post method is an async call?

Thank you in advance.

Samuele