我正在尝试初始化"Web Worker"中的Breeze管理器。
RequireJs、淘汰赛、q、微风正在工人内部导入
调用:EntityQuery.from('name').using(manager).execute()
后,
出现以下错误:Uncaught Error: Q is undefined. Are you missing Q.js? See https://github.com/kriskowal/q
。
实时预览已上传到此处http://plnkr.co/edit/meXjKa?p=preview
(plunk支持下载以便于调试)。
EDIT——相关代码
Worker.js
importScripts('knockout.js', 'q.js', 'breeze.js', 'require.js');
define('jquery', function () { return jQuery; });
define('knockout', ko);
define('q', Q); //Just trying to assign q since breeze requests Q as q
require(function () {
var self = this;
this.q = this.Q; //Just trying to assign q since breeze requests Q as q
breeze.NamingConvention.camelCase.setAsDefault();
var manager = new breeze.EntityManager("breeze/Breeze");
var EntityQuery = breeze.EntityQuery;
// Q or q here is defined (TESTED)
var test = function (name) {
return EntityQuery.from(name)
.using(manager).execute() // <-- Here q/Q breaks (I think on execute)
};
var primeData = function () {
return test('Languages')
.then(test('Lala'))
.then(test('Lala2'))
};
primeData();
setTimeout(function () { postMessage("TestMan"); }, 500);
});
Worker将在主页面上初始化为:
var myWorker = new Worker("worker.js");
好了,开始了:
-
创建一个新的requireJs并将
isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document)
编辑为isBrowser = false
-
创建一个新的Jquery,这样它就不会使用和窗口相关的内容,通常也不会使用WebWorker无法访问的内容。不幸的是,我不记得我从哪里得到这个自定义JQueryJs,但我已经把它上传到了这里。"https://dl.dropboxusercontent.com/u/48132252/jqueydemo.js".
如果您找到作者或原始更改链接,请给予信用。 -
我的workerJs文件看起来像:
importScripts('Scripts/test.js', 'Scripts/jqueydemo.js', 'Scripts/q.js', 'Scripts/breeze.debug.js', 'Scripts/require2.js'); define('jquery', function () { return jQuery; }); require( { baseUrl: "..", }, function () { var manager = new breeze.EntityManager("breeze/Breeze"); var EntityQuery = breeze.EntityQuery; var primeData = function () { return EntityQuery.from(name) .using(manager).execute() // Get my Data .then(function (data) { console.log("fetced!n" + ((new Date()).getTime())); var exportData = manager.exportEntities(); // Export my constructed entities console.log("created!n" + ((new Date()).getTime())); var lala = JSON.stringify(exportData) postMessage(lala); // Send them as a string to the main thread }) }; primeData(); });
-
最后,在我的mainJs上,我有这样的东西:
this.testWorker = function () { var myWorker = new Worker("worker.js"); // Init Worker myWorker.onmessage = function (oEvent) { // On worker job finished toastr.success('Worker finished and returned'); var lala = JSON.parse(oEvent.data); // Reverse string to JSON manager.importEntities(lala); // Import the pre-Constructed Entities to breezeManager toastr.success('Import done'); myWorker.terminate(); }; };
因此,我们已经设法在WebWorker环境中使用微风来获取和创建我们所有的实体,并将导出的实体传递到主线程上的主微风管理器(导入)。
我已经用9个彼此完全相关的表和大约4MB的原始数据进行了测试。
利润:UI始终保持完全响应
不再有长执行脚本,应用程序没有响应或内存不足错误)至少对于chrome
*有意义的是,导入实体比创建完整的4MB原始数据加上这些实体的关联过程快得多
通过在背面完成所有繁重的工作,并且只在正面使用导入实体,bread允许您像处理bread一样处理大型数据集。