BreezeJs与敬业的网络工作者



我正在尝试初始化"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");  

好了,开始了:

  1. 创建一个新的requireJs并将
    isBrowser = !!(typeof window !== 'undefined' && typeof navigator !== 'undefined' && window.document)
    编辑为
    isBrowser = false

  2. 创建一个新的Jquery,这样它就不会使用和窗口相关的内容,通常也不会使用WebWorker无法访问的内容。不幸的是,我不记得我从哪里得到这个自定义JQueryJs,但我已经把它上传到了这里。"https://dl.dropboxusercontent.com/u/48132252/jqueydemo.js".
    如果您找到作者或原始更改链接,请给予信用。

  3. 我的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();
    }); 
    
  4. 最后,在我的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一样处理大型数据集。

相关内容

  • 没有找到相关文章

最新更新