Debouncing Models Observable as they may be triggered too frequently and cause an InfiniteDigest Exception
Change-Id: Idaa49acc9307c93fb46b5378fa7aa1c7b201dfc6
diff --git a/src/app/datasources/stores/model.store.spec.ts b/src/app/datasources/stores/model.store.spec.ts
index 533a53d..b114de4 100644
--- a/src/app/datasources/stores/model.store.spec.ts
+++ b/src/app/datasources/stores/model.store.spec.ts
@@ -8,6 +8,7 @@
import {ModelRest} from '../rest/model.rest';
import {ConfigHelpers} from '../../core/services/helpers/config.helpers';
import {AuthService} from '../rest/auth.rest';
+import {XosDebouncer} from '../../core/services/helpers/debounce.helper';
let service: IXosModelStoreService;
let httpBackend: ng.IHttpBackendService;
@@ -49,7 +50,8 @@
.service('XosModelStore', XosModelStore)
.service('ConfigHelpers', ConfigHelpers) // TODO mock
.service('AuthService', AuthService)
- .constant('AppConfig', MockAppCfg);
+ .constant('AppConfig', MockAppCfg)
+ .service('XosDebouncer', XosDebouncer);
angular.mock.module('ModelStore');
});
diff --git a/src/app/datasources/stores/model.store.ts b/src/app/datasources/stores/model.store.ts
index 79b7231..ab2f3d2 100644
--- a/src/app/datasources/stores/model.store.ts
+++ b/src/app/datasources/stores/model.store.ts
@@ -4,6 +4,7 @@
import {IWSEvent, IWSEventService} from '../websocket/global';
import {IXosResourceService} from '../rest/model.rest';
import {IStoreHelpersService} from '../helpers/store.helpers';
+import {IXosDebouncer} from '../../core/services/helpers/debounce.helper';
export interface IXosModelStoreService {
query(model: string, apiUrl?: string): Observable<any>;
@@ -11,15 +12,18 @@
}
export class XosModelStore implements IXosModelStoreService {
- static $inject = ['$log', 'WebSocket', 'StoreHelpers', 'ModelRest'];
+ static $inject = ['$log', 'WebSocket', 'StoreHelpers', 'ModelRest', 'XosDebouncer'];
private _collections: any; // NOTE contains a map of {model: BehaviourSubject}
+ private efficientNext: any; // NOTE debounce next
constructor(
private $log: ng.ILogService,
private webSocket: IWSEventService,
private storeHelpers: IStoreHelpersService,
private ModelRest: IXosResourceService,
+ private XosDebouncer: IXosDebouncer
) {
this._collections = {};
+ this.efficientNext = this.XosDebouncer.debounce(this.next, 500, false);
}
public query(modelName: string, apiUrl: string): Observable<any> {
@@ -31,7 +35,7 @@
}
// else manually trigger the next with the last know value to trigger the subscribe method of who's requestiong this data
else {
- this._collections[modelName].next(this._collections[modelName].value);
+ this.efficientNext(this._collections[modelName]);
}
this.webSocket.list()
@@ -80,6 +84,10 @@
// TODO implement a get method
}
+ private next(subject: BehaviorSubject<any>): void {
+ subject.next(subject.value);
+ }
+
private loadInitialData(model: string, apiUrl?: string) {
// TODO provide always the apiUrl togheter with the query() params
if (!angular.isDefined(apiUrl)) {