BreezeJs和专门的网络工作者 [英] BreezeJs with dedicated web worker

查看:79
本文介绍了BreezeJs和专门的网络工作者的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在 Web Worker中初始化Breeze管理器。

I am trying to initialize a Breeze manager inside a 'Web Worker'.

RequireJs,剔除,q,微风正被导入到Worker中。

调用后: EntityQuery.from('name')。using(manager).execute()

以下错误出现:

未捕获错误:Q未定义。您是否缺少Q.js?参见https://github.com/kriskowal/q

RequireJs, knockout, q, breeze are being imported inside the worker.
After a call to:EntityQuery.from('name').using(manager).execute(),
the following error appears:
Uncaught Error: Q is undefined. Are you missing Q.js? See https://github.com/kriskowal/q.

实时预览在此处上传 http: //plnkr.co/edit/meXjKa?p=preview

(plunk支持下载以简化调试)。

A live preview is uploaded here http://plnkr.co/edit/meXjKa?p=preview
(plunk supports downloading for easier debug).

编辑-相关代码

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 will be initialized on main page as:

var myWorker = new Worker("worker.js");  


推荐答案

确定了:


  1. 创建一个新的requireJs并编辑

    isBrowser = !!(typeof window!==' undefined'&& typeof navigator!=='undefined'&& window.document)

    to

    isBrowser = false

创建一个新的Jquery,以便它不使用与窗口相关的任何内容,并且通常不使用WebWorker无法访问的任何内容。不幸的是,我不记得我在哪里获得了这个自定义JQueryJs,但是我已经在这里上传了它 https: //dl.dropboxusercontent.com/u/48132252/jqueydemo.js

如果您找到作者或原始更改链接,请给予感谢。

Create a new Jquery so it uses nothing related to window and generally anything that a WebWorker cannot access. Unfortunatelly i can't remember where i got this Custom JQueryJs but i have uploaded it here "https://dl.dropboxusercontent.com/u/48132252/jqueydemo.js".
Please if you find the author or the original change link and give credit.

我的workerJs文件如下:

My workerJs file looks like:

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上我有类似的东西:

  • Finally on my mainJs i have something like:

        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环境用于获取和创建我们的所有实体,将导出的实体传递给主线程(导入)上的主微风管理器。

    So we have managed to use breeze on a WebWorker enviroment to fetch and create all of our entities, pass our exported entities to our main breeze manager on the main thread(import).

    我已经用9个表对此进行了测试彼此完全相关,并且大约有4MB的原始数据。

    I have tested this with 9 tables fully related to each other and about 4MB of raw data.


    利润:UI始终保持完全响应。

    不再需要长时间执行脚本,应用程序无响应或内存不足错误),至少对于chrome

    PROFIT: UI stays fully responsive all the time.
    No more long execution script, application not responding or out of memory errors) at least for chrome

    *而不是为这些实体创建完整的4MB原始数据以及后续的关联过程。

    通过在背面完成所有繁重的工作,并且仅在正面使用导入实体,微风使您可以处理大型数据集'如微风'。

    *As it makes sense breeze import entities is way more faster than the creation a full 4MB raw data plus the association process following for these entities.
    By having all the heavy work done on the back, and only use import entities on the front, breeze allows you to handle large datasets 'like a breeze'.

    这篇关于BreezeJs和专门的网络工作者的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆