I have this function which returns a promise as it's fetching asynchronously data. As you see there are watchers inside the code of that promise ($watchCollection) which keeps watching data and triggers the promise's resolve function for each change.
I can't test whether the then will triggers multiple times once for each resolve function call or not. Is this possible ?
this.getGridDataAndMetaData = function(viewId) {          
    return new Promise(function(resolve, reject) {
        dataStore.fetchView(viewId)
            .then(function(viewEntity) {
                var grid_groupement = viewEntity.descriptor.state ? viewEntity.descriptor.state.grid_groupement : undefined;
                var dataStoreEntities = viewEntity.getEntityType().getEntities();
                var dataStoreProperties = viewEntity.getEntityType().getProperties();
                var gridDataAndMetaData;
                $rootScope.$watchCollection(function() {
                        return dataStoreEntities;
                    },
                    function(newCollection, oldCollection) {    
                        if (!angular.equals(newCollection, {}))
                            formatDataStoreEntities(angular.copy(newCollection), grid_groupement)
                            .then(function(data) {  
                                gridDataAndMetaData = data;                                            
                                if (lastNewProperties != undefined && !angular.equals(lastNewProperties, [])) {
                                    data.viewEntity = viewEntity;
                                    data.grid_groupement = grid_groupement;
                                    data.properties = lastNewProperties;   
                                    resolve(data);
                                }
                            });
                    });
                $rootScope.$watchCollection(function() {
                        return dataStoreProperties;
                    },
                    function(newProperties, oldProperties) {                                    
                        lastNewProperties = angular.copy(newProperties);                                    
                        if (gridDataAndMetaData != undefined && !angular.equals(gridDataAndMetaData.valuesIdsEntitiesTabFormat, {})) {                                                        
                            generateServiceTabs(newProperties, function() {
                                data.viewEntity = viewEntity;
                                data.grid_groupement = grid_groupement;
                                data.properties = lastNewProperties;
                                resolve(data);
                            });
                        }
                    });
            }).catch(function(error) {
                console.error('%c getGridDataAndMetaData :: dataStore.fetchView(viewId):: error : ' + JSON.stringify(error), 'background: red; color: white; display: block;');
                reject(error);
            });
    });
}
 
     
    