diff options
| author | Christophe Matthieu <chm@odoo.com> | 2015-07-17 15:34:31 +0200 |
|---|---|---|
| committer | Christophe Matthieu <chm@odoo.com> | 2015-07-22 12:15:24 +0200 |
| commit | 71732dceb6613dab28d6eef96fa155acc91af7ce (patch) | |
| tree | 1f33280ca569fd23912a640a79ec8d878d934bfc /addons/web/static/src/js | |
| parent | dfad968515b523ebc900a0ba0fa1b111626f6149 (diff) | |
[IMP] web: module can be asynchronous loaded if it return a deferred
Each module can return a deferred. In that case, the module is marked as loaded
only when the deferred is resolved, and its value is equal to the resolved value.
The module can be rejected (unloaded). This will be logged in the console as info.
Remove if_dom_contains from the website, the modules return a rejected deferred if
the DOM doesn't contains the seleted values.
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/boot.js | 63 |
1 files changed, 53 insertions, 10 deletions
diff --git a/addons/web/static/src/js/boot.js b/addons/web/static/src/js/boot.js index 19fb4c51204..dc4ea5b337c 100644 --- a/addons/web/static/src/js/boot.js +++ b/addons/web/static/src/js/boot.js @@ -5,6 +5,10 @@ /** * @name openerp * @namespace openerp + * + * Modules can return a deferred the module is mark as loaded only when + * the deferred is resolved, and the service value equal the resolved value. + * The module can be rejected (unloaded) and logged as info. */ (function() { @@ -14,6 +18,7 @@ var factories = Object.create(null); var job_names = []; var job_deps = []; + var job_deferred = []; var services = Object.create({ qweb: new QWeb2.Engine(), @@ -29,6 +34,7 @@ var odoo = window.odoo = { testing: typeof QUnit === "object", debug: debug, + remaining_jobs: jobs, __DEBUG__: { get_dependencies: function (name, transitive) { @@ -122,7 +128,11 @@ odoo.__DEBUG__.web_client = services['web.web_client']; if (jobs.length) { - var debug_jobs = {}, job; + var debug_jobs = {}; + var rejected = []; + var rejected_linked = []; + var job; + var jobdep; for (var k=0; k<jobs.length; k++) { debug_jobs[jobs[k].name] = job = { @@ -133,13 +143,26 @@ if (jobs[k].error) { job.error = jobs[k].error; } + if (jobs[k].rejected) { + job.rejected = jobs[k].rejected; + rejected.push(job.name); + } var deps = odoo.__DEBUG__.get_dependencies( job.name ); for (var i=0; i<deps.length; i++) { if (job.name !== deps[i] && !(deps[i] in services)) { - if (!job.missing) { - job.missing = []; + jobdep = debug_jobs[deps[i]] || (deps[i] in factories && _.find(jobs, function (job) { return job.name === deps[i];})); + if (jobdep && jobdep.rejected) { + if (!job.rejected) { + job.rejected = []; + rejected_linked.push(job.name); + } + job.rejected.push(deps[i]); + } else { + if (!job.missing) { + job.missing = []; + } + job.missing.push(deps[i]); } - job.missing.push(deps[i]); } } } @@ -152,20 +175,34 @@ } }, process_jobs: function (jobs, services) { - var job, require; - while (jobs.length && (job = _.find(jobs, is_ready))) { - require = make_require(job); + var job; + var require; + var time; + + function process_job (job) { + var require = make_require(job); try { - services[job.name] = job.factory.call(null, require); + var def = $.Deferred(); + $.when(job.factory.call(null, require)).then( + function (data) { + services[job.name] = data; + clearTimeout(time); + time = _.defer(odoo.process_jobs, jobs, services); + def.resolve(); + }, function (e) { + job.rejected = e || true; + jobs.push(job); + def.resolve(); + }); jobs.splice(jobs.indexOf(job), 1); + job_deferred.push(def); } catch (e) { job.error = e; } } - return services; function is_ready (job) { - return !job.error && _.every(job.factory.deps, function (name) { return name in services; }); + return !job.error && !job.rejected && _.every(job.factory.deps, function (name) { return name in services; }); } function make_require (job) { @@ -183,6 +220,12 @@ require.__require_calls = 0; return require; } + + while (jobs.length && (job = _.find(jobs, is_ready))) { + process_job(job); + } + + return services; } }; |
