Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Migrate all jQuery promises to native ES6 Promise (ref: $.Deferred(), $.when(), $.get() and $.post()) #308

Draft
wants to merge 56 commits into
base: dev
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
f2f7104
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
f67ed66
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
65c9399
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
ed7c43b
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
7603140
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
a8a62dd
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
42f826b
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
a1f9cb4
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
12c6258
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
4fded2e
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
acd3404
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
87c3a21
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
4d5e298
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
5c961cf
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
bf06032
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
de6424f
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
370c791
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
f98ceb1
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
7cfb0a3
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
76d1f69
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
dfbe30a
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
17c6476
Replace $.Deferred with Promise.resolve
volterra79 Jan 18, 2023
adb68c6
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
619b441
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
68f2b94
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
017f133
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
e5da2d5
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
c2f873e
Replace $.Deferred with new Promise
volterra79 Jan 18, 2023
5219444
Replace .fail (Jquery Deferred method) with .catch (Promise Method)
volterra79 Jan 18, 2023
5c74da0
Replace .catch .fail on $.get
volterra79 Jan 18, 2023
3534b33
Replace $.when jquery method with Promise.allSettled
volterra79 Jan 18, 2023
d1577eb
Replace .catch with .fail due of use of $.get jquery method
volterra79 Jan 18, 2023
ae0c0c6
Replace .catch with .fail due of use of $.ajax jquery method
volterra79 Jan 18, 2023
98a4d12
add a fallback for jQuery fail() and always() methods
Raruto Jan 19, 2023
f780905
add a fallback for native catch() and finall() methods
Raruto Jan 19, 2023
f658c6a
Replace .catch with .fail due of use of $.post jquery method
volterra79 Jan 19, 2023
977d9f6
Merge branch 'replace-jquery-Deferred-with-Promise' of https://github…
volterra79 Jan 19, 2023
839549a
Setter function return directly a value instead a promise as $.Deferr…
volterra79 Jan 19, 2023
c7cf200
Mispelling Defferred instead Deferred
volterra79 Jan 19, 2023
7b78192
Promise resolve has jus one parameter <value>. So need to wrap multi …
volterra79 Jan 19, 2023
cbd94bd
Replace $.get with XHR.get and $.post with XHR.post
volterra79 Jan 20, 2023
757e32f
Revert comment code used for internal development
volterra79 Jan 20, 2023
5af9b70
Set Object to params on XHR.get method
volterra79 Jan 20, 2023
54f04c8
Add _promise_methods Object to handle resolve and reject from externa…
volterra79 Jan 20, 2023
3873f2b
Chane .done method of return $.Deferred promise to .then Promise
volterra79 Jan 20, 2023
2508d4b
Replace $.when with Promise.all
volterra79 Jan 20, 2023
a733357
add a fallback for jQuery `resolve()` and `reject()` methods
Raruto Jan 24, 2023
dc36bc2
add deprecation warning for `$.Deferred::resolve()` and `$.Deferred::…
Raruto Jan 24, 2023
8aced3d
add deprecation notice for `$.Deferred::promise()` and `$.Deferred::d…
Raruto Jan 24, 2023
2b0da39
reduce deprecation warning verbosity
Raruto Jan 24, 2023
92959b8
add deprecation notice for `$.get()` and `$.post()`
Raruto Feb 3, 2023
419c113
Merge branch 'dev' into replace-jquery-Deferred-with-Promise
Raruto Jul 21, 2023
c535906
Merge branch 'dev' into replace-jquery-Deferred-with-Promise
Raruto Feb 15, 2024
e8ca08e
replace almost all jquery promises
Raruto Feb 16, 2024
2269a40
wrong method
Raruto Feb 19, 2024
f7f4ba3
Clean code
volterra79 Feb 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
200 changes: 119 additions & 81 deletions src/app/core/g3wobject.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,13 @@ proto.onafter = function(setter, listener, priority){
return this._onsetter('after', setter, listener, false, priority);
};

/**
* @FIXME add description
* @param setter
* @param listener
* @param priority
* @return {*}
*/
proto.onceafter = function(setter, listener, priority){
return this._onsetter('after', setter, listener, false, priority, true);
};
Expand Down Expand Up @@ -55,15 +62,25 @@ proto.onbeforeasync = function(setter, listener, priority) {
return this._onsetter('before', setter, listener, true, priority);
};

/**
* @FIXME add description
* @param setter
* @param key
*/
proto.un = function(setter, key) {
// cicle on after before (key) and for each settersListeners (array) find key
Object.entries(this.settersListeners).forEach(([_key, settersListeners]) => {
if (key === undefined) settersListeners[setter].splice(0);
else settersListeners[setter].forEach((setterListener, idx) => {
if (setterListener.key === key) {
settersListeners[setter].splice(idx, 1);
Object
.entries(this.settersListeners)
.forEach(([_key, settersListeners]) => {
if (undefined === key) {
settersListeners[setter].splice(0);
} else {
settersListeners[setter].forEach((setterListener, idx) => {
if (setterListener.key === key) {
settersListeners[setter].splice(idx, 1);
}
})
}
})
});
};

Expand All @@ -75,7 +92,7 @@ proto.un = function(setter, key) {
proto._onsetter = function(when, setter, listener, async, priority=0, once=false) {
let listenerKey;
// check if setter function is register.
if (typeof this.settersListeners[when][setter] !== "undefined") {
if (undefined !== this.settersListeners[when][setter]) {
// set unique listenerKey value
listenerKey = `${Math.floor(Math.random()*1000000) + Date.now()}`;
// add info object to setters listeners
Expand All @@ -86,105 +103,121 @@ proto._onsetter = function(when, setter, listener, async, priority=0, once=false
priority,
once
});
// set lineners base on priority
// set listeners base on priority
this.settersListeners[when][setter] = _.sortBy(this.settersListeners[when][setter], setterListener => setterListener.priority);
}
// return key
return listenerKey // in case of no setter register return undefined listerKey
};

/**
* @FIXME add description
* @param setters
* @return {*|{before: {}, after: {}}}
* @private
*/
proto._setupListenersChain = function(setters) {
// initialize all methods inside object "setters" of child class.
this.settersListeners = {
after: {},
before: {}
after : {},
before: {},
};
for (const setter in setters) {
const setterOption = setters[setter];
let setterFnc = noop;
let setterFnc = noop;
let setterFallback = noop;
if (_.isFunction(setterOption)) setterFnc = setterOption;
else {
setterFnc = setterOption.fnc;
const setterOption = setters[setter];
if ('function' === typeof setterOption) {
setterFnc = setterOption;
} else {
setterFnc = setterOption.fnc;
setterFallback = setterOption.fallback || noop; // method called in case of error
}
// create array to push before and after subscribers
this.settersListeners.after[setter] = [];
this.settersListeners.after[setter] = [];
this.settersListeners.before[setter] = [];
// assign the property settern name to the object as own method
// assign the property setter name to the object as own method
this[setter] = function(...args) {
const deferred = $.Deferred();
let returnVal = null;
let counter = 0;
// function to call original function(setter function)
const callSetter = () => {
// run setter function
returnVal = setterFnc.apply(this, args);
// resolve promise
deferred.resolve(returnVal);
//call all subscribed methods afet setter
const onceListenerKeys = [];
const afterListeners = this.settersListeners.after[setter];
afterListeners.forEach(listener => {
listener.fnc.apply(this, args);
listener.once && onceListenerKeys.push(listener.key);
});
onceListenerKeys.forEach(key => this.un(setter, key));
};
// abort function
const abort = () => {
setterFallback.apply(this, args);
deferred.reject();
};
// get all before listeners functions of setter
const beforeListeners = this.settersListeners['before'][setter];
// listener counter
counter = 0;
const next = bool => {
// initilize cont to true (continue)
let cont = true;
// check if bool is Boolean
if (_.isBoolean(bool)) cont = bool;
// check if count is false or we are arrived to the end of onbefore subscriber
if (cont === false) {
return new Promise((resolve, reject) => {
let returnVal = null;
let counter = 0;
// function to call original function(setter function)
const callSetter = () => {
// run setter function
returnVal = setterFnc.apply(this, args);
// resolve promise
resolve(returnVal);
//call all subscribed methods afet setter
const onceListenerKeys = [];
const afterListeners = this.settersListeners.after[setter];
afterListeners.forEach(listener => {
listener.fnc.apply(this, args);
if (listener.once) {
onceListenerKeys.push(listener.key);
}
});
onceListenerKeys.forEach(key => this.un(setter, key));
};
// abort function
const abort = () => {
setterFallback.apply(this, args);
reject();
};
// get all before listeners functions of setter
const beforeListeners = this.settersListeners['before'][setter];
// listener counter
counter = 0;
const next = bool => {
// initilize cont to true (continue)
let cont = true;
// check if bool is Boolean
if (_.isBoolean(bool)) {
cont = bool;
}
// check if count is false, or we are arrived to the end of onbefore subscriber
if (cont === false) {
// found an error so we can abort
abort.apply(this, args);
} else if (counter === beforeListeners.length) {
// call complete method methods
const completed = callSetter();
//verifico che cosa ritorna
if (completed === undefined || completed === true) {
this.emitEvent(`set:${setter}`,args);
} else if (counter === beforeListeners.length) {
// call complete method methods
const completed = callSetter();
//check return value
if (undefined === completed || completed === true) {
this.emitEvent(`set:${setter}`,args);
}
} else if (cont) {
const listenerObj = beforeListeners[counter];
const currentCounter = counter;
// if is async functtion
if (beforeListeners[counter].async) {
//add function next to argument of listnerFunction
args.push(next);
// update counter
counter += 1;
listenerObj.fnc.apply(this, args)
} else {
// return or undefine or a boolen to tell if ok(true) can conitnue or not (false)
const bool = listenerObj.fnc.apply(this, args);
//update counter
counter += 1;
next(bool);
}
listenerObj.once && beforeListeners.splice(currentCounter, 1);
}
} else if (cont) {
const listenerObj = beforeListeners[counter];
const currentCounter = counter;
// if is async functtion
if (beforeListeners[counter].async) {
//add function next to argument of listnerFunction
args.push(next);
// update counter
counter += 1;
listenerObj.fnc.apply(this, args)
} else {
// return or undefine or a boolen to tell if ok(true) can conitnue or not (false)
const bool = listenerObj.fnc.apply(this, args);
//update counter
counter += 1;
next(bool);
}
listenerObj.once && beforeListeners.splice(currentCounter, 1);
}
};
// run next to start to run all the subscribers and setrer its self
next();
// retun a promise
return deferred.promise();
};
// run next to start to run all the subscribers and setrer its self
next();
// return a promise
})
}
}
return this.settersListeners
};

/**
* @FIXME add description
* @param debounces
* @private
*/
proto._setupDebounces = function(debounces) {
for (const name in debounces) {
const delay = debounces[name].delay;
Expand All @@ -193,6 +226,11 @@ proto._setupDebounces = function(debounces) {
}
};

/**
* @FIXME add description
* @param throttles
* @private
*/
proto._setupThrottles = function(throttles) {
for (const name in throttles) {
const delay = throttles[name].delay;
Expand Down
56 changes: 26 additions & 30 deletions src/app/core/layers/features/featuresstore.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,32 +62,28 @@ proto.getProvider = function() {

// method unlock features
proto.unlock = function() {
const d = $.Deferred();
this._provider.unlock()
.then(response => {
d.resolve(response)
})
.fail(err => d.reject(err));
return d.promise();
return new Promise((resolve, reject) => {
this._provider.unlock()
.then(response => { resolve(response) })
.catch(err => reject(err));
})
};

// method get all features from server or attribute _features
proto._getFeatures = function(options={}) {
const d = $.Deferred();
if (this._provider) {
//call provider getFeatures to get features from server
this._provider.getFeatures(options)
.then(options => {
//get features base on response from server features, featurelockis etc ...
const features = this._filterFeaturesResponse(options);
this.addFeatures(features);
d.resolve(features);
})
.fail(err => d.reject(err))
} else {
d.resolve(this._readFeatures());
}
return d.promise();
return new Promise((resolve, reject) => {
if (this._provider) {
// call provider getFeatures to get features from server
this._provider.getFeatures(options)
.then(options => {
// get features base on response from server features, featurelockis etc ...
const features = this._filterFeaturesResponse(options);
this.addFeatures(features);
resolve(features);
})
.catch(err => reject(err))
} else resolve(this._readFeatures());
})
};

//filter features to add
Expand Down Expand Up @@ -174,14 +170,14 @@ proto._readFeatures = function() {
};

proto._commit = function(commitItems) {
const d = $.Deferred();
if (commitItems && this._provider) {
commitItems.lockids = this._lockIds;
this._provider.commit(commitItems)
.then(response => d.resolve(response))
.fail(err => d.reject(err))
} else d.reject();
return d.promise();
return new Promise((resolve, reject) => {
if (commitItems && this._provider) {
commitItems.lockids = this._lockIds;
this._provider.commit(commitItems)
.then(response => resolve(response))
.catch(err => reject(err))
} else reject();
})
};

// get feature from id
Expand Down