;(function () { var contexts = {}; var init = false; var WORKER; var enableWorker = function () { if (init) { return init; } // 开启Worker模式 BI.config("bi.provider.system", function (provider) { provider.setWorkerMode(true); }); var _init = BI.Widget.prototype._init; BI.Widget.prototype._init = function () { this.$destroyWorker = createWorker.call(this); try { _init.apply(this, arguments); } catch (e) { console.error(e); } }; var _initRender = BI.Widget.prototype._initRender; var postMessage = function (data) { switch (data.eventType) { case "create": this.model = data.msg; _initRender.call(this); break; case "watch": var watchArgs = data.args; this.watch[data.currentWatchType].apply(this, watchArgs); break; } }; BI.Widget.prototype._initRender = function () { if (WORKER && this._worker) { this.__asking = true; this.__async = true; } else { _initRender.apply(this, arguments); } }; var unMount = BI.Widget.prototype.__d; BI.Widget.prototype.__d = function () { this.$destroyWorker && this.$destroyWorker(); try { unMount.apply(this, arguments); } catch (e) { console.error(e); } }; init = postMessage; return postMessage; }; BI.useWorker = function (wk) { if (!_global.Worker || !_global.Proxy) { return; } var postMessage = enableWorker(); WORKER = wk; if (WORKER) { WORKER.addEventListener("message", function (e) { var data = e.data; postMessage.apply(contexts[data.name], [data]); }, false); } }; function createWorker () { var self = this; if (this._worker) { var name = this.getName(); var modelType = this._worker(); var options; if (BI.isArray(modelType)) { options = modelType[1]; modelType = modelType[0]; } if (WORKER) { contexts[name] = this; WORKER.postMessage({ type: modelType, name: name, eventType: "create", options: options, watches: BI.map(this.$watch || this.watch, function (key) { return key; }) }); var store = {}; this.store = new Proxy(store, { get: function (target, key) { return function () { WORKER.postMessage({ type: modelType, name: name, eventType: "action", action: key, args: [].slice.call(arguments) }); }; }, set: function (target, key, value) { return Reflect.set(target, key, value); } }); return function () { delete contexts[name]; WORKER.postMessage({ type: modelType, name: name, eventType: "destroy" }); }; } } } }());