Browse Source

Pull request #1569: 无JIRA任务 webworker增加删除机制

Merge in VISUAL/fineui from ~GUY/fineui:master to master

* commit '1f6b8b46aee067fb83329e2b34bf64f0de09fa3b':
  webworker
es6
guy 4 years ago
parent
commit
5663e80e8c
  1. 10
      dist/fix/worker.compact.js
  2. 32
      src/core/worker.js

10
dist/fix/worker.compact.js vendored

@ -7,7 +7,7 @@
var _init = BI.Widget.prototype._init; var _init = BI.Widget.prototype._init;
BI.Widget.prototype._init = function () { BI.Widget.prototype._init = function () {
createWorker.call(this); this.$destroyWorker = createWorker.call(this);
try { try {
_init.apply(this, arguments); _init.apply(this, arguments);
} catch (e) { } catch (e) {
@ -40,6 +40,7 @@
var unMount = BI.Widget.prototype.__d; var unMount = BI.Widget.prototype.__d;
BI.Widget.prototype.__d = function () { BI.Widget.prototype.__d = function () {
delete contexts[this.getName()]; delete contexts[this.getName()];
this.$destroyWorker && this.$destroyWorker();
try { try {
unMount.apply(this, arguments); unMount.apply(this, arguments);
} catch (e) { } catch (e) {
@ -84,6 +85,13 @@
return Reflect.set(target, key, value); return Reflect.set(target, key, value);
} }
}); });
return function () {
worker.postMessage({
type: modelType,
name: name,
eventType: "destroy"
});
};
} }
} }
}()); }());

32
src/core/worker.js

@ -7,27 +7,39 @@
})); }));
} }
var models = {}; var models = {}, watches = {};
addEventListener("message", function (e) { addEventListener("message", function (e) {
var data = e.data; var data = e.data;
switch (data.eventType) { switch (data.eventType) {
case "action": case "action":
models[data.name][data.action].apply(models[data.name], data.args); models[data.name][data.action].apply(models[data.name], data.args);
break; break;
default: case "destroy":
BI.each(watches[data.name], function (i, unwatches) {
unwatches = BI.isArray(unwatches) ? unwatches : [unwatches];
BI.each(unwatches, function (j, unwatch) {
unwatch();
});
});
delete models[data.name];
delete watches[data.name];
break;
case "create":
var store = models[data.name] = BI.Models.getModel(data.type, data.options); var store = models[data.name] = BI.Models.getModel(data.type, data.options);
for (var i = 0, len = data.watches.length; i < len; i++) { watches[data.name] = [];
var key = data.watches[i]; BI.each(data.watches, function (i, key) {
createWatcher(store.model, key, function () { watches[data.name].push(createWatcher(store.model, key, function (newValue, oldValue) {
postMessage(BI.extend({}, data, { postMessage(BI.extend({}, data, {
eventType: "watch", eventType: "watch",
currentWatchType: key currentWatchType: key
}, {args: [].slice.call(arguments, 0, 2)})); }, {args: [newValue, oldValue]}));
}); }));
} });
postMessage(BI.extend({ postMessage(BI.extend({}, data, {
eventType: "create" eventType: "create"
}, data, {msg: store.model})); }, {msg: store.model}));
break;
default:
break; break;
} }
}, false); }, false);

Loading…
Cancel
Save