BreezeJs有专门的网络工作者

时间:2014-03-02 19:29:16

标签: javascript requirejs breeze web-worker q

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

1 个答案:

答案 0 :(得分:1)

好在这里:

  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();
        };
    };  
    
  5. 因此,我们设法在WebWorker环境中使用breeze来获取和创建我们的所有实体,将我们的导出实体传递给主线程上的主要breeze管理器(导入)。

    我已经测试了9个与彼此完全相关的表和大约4MB的原始数据。

      

    利润:用户界面始终保持完全响应   没有更长的执行脚本,应用程序没有响应或内存不足错误)至少对于chrome

    *因为它有意义breeze导入实体比创建完整的4MB原始数据加上这些实体的关联过程更快。
    通过在后面完成所有繁重的工作,并且仅使用前面的导入实体,breeze允许您像处理微风一样处理大型数据集“”。