diff options
| author | Xavier Morel <xmo@openerp.com> | 2012-03-01 16:23:15 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2012-03-01 16:23:15 +0100 |
| commit | 190eb339faeed6755de7b77b3f0152a5e3c39c8e (patch) | |
| tree | a1541e644f636175092eec6170c611bb383ecffd /addons/web/static/src/js/data.js | |
| parent | 8225ef6c995ae302b61020d27c14e7bfbb11109d (diff) | |
[ADD] replacement for current aborter/abort_last hack: UDP-style handler of mis-ordered requests
* By default, ignores (refuses to resolve) mis-ordered request when they come back
* Optionally, fails them
bzr revid: xmo@openerp.com-20120301152315-67kbkdwpy7cdh25y
Diffstat (limited to 'addons/web/static/src/js/data.js')
| -rw-r--r-- | addons/web/static/src/js/data.js | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index 27d4562aafb..55e200a205f 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -1190,6 +1190,46 @@ openerp.web.CompoundDomain = openerp.web.Class.extend({ return this.__eval_context; } }); + +openerp.web.DropMisordered = openerp.web.Class.extend(/** @lends openerp.web.DropMisordered# */{ + /** + * @constructs openerp.web.DropMisordered + * @extends openerp.web.Class + * + * @param {Boolean} [failMisordered=false] whether mis-ordered responses should be failed or just ignored + */ + init: function (failMisordered) { + // local sequence number, for requests sent + this.lsn = 0; + // remote sequence number, seqnum of last received request + this.rsn = -1; + this.failMisordered = failMisordered || false; + }, + /** + * Adds a deferred (usually an async request) to the sequencer + * + * @param {$.Deferred} deferred to ensure add + * @returns {$.Deferred} + */ + add: function (deferred) { + var res = $.Deferred(); + + var self = this, seq = this.lsn++; + deferred.then(function () { + if (seq > self.rsn) { + self.rsn = seq; + res.resolve.apply(res, arguments); + } else if (self.failMisordered) { + res.reject(); + } + }, function () { + res.reject.apply(res, arguments); + }); + + return res.promise(); + } +}); + }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: |
