我正在尝试在“Web Worker”中初始化一个Breeze管理器。
在工作人员中输入RequireJs,knockout,q,breeze
致电: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支持下载以便于调试)。
编辑 - 相关代码
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);
});
工作人员将在主页面上初始化为:
var myWorker = new Worker("worker.js");
答案 0 :(得分:1)
好在这里:
创建新的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环境中使用breeze来获取和创建我们的所有实体,将我们的导出实体传递给主线程上的主要breeze管理器(导入)。
我已经测试了9个与彼此完全相关的表和大约4MB的原始数据。
利润:用户界面始终保持完全响应 没有更长的执行脚本,应用程序没有响应或内存不足错误)至少对于chrome
*因为它有意义breeze导入实体比创建完整的4MB原始数据加上这些实体的关联过程更快。
通过在后面完成所有繁重的工作,并且仅使用前面的导入实体,breeze允许您像处理微风一样处理大型数据集“”。