gpt4 book ai didi

javascript - 带有专用网络 worker 的 BreezeJs

转载 作者:行者123 更新时间:2023-11-30 05:38:34 25 4
gpt4 key购买 nike

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

requireJs, knockout, q, breeze正在worker内部导入。
在调用:EntityQuery.from('name').using(manager).execute() 后,
出现以下错误:
未捕获错误:Q 未定义。你缺 Q.js 吗?请参阅 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);
});

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

我用 9 个彼此完全相关的表和大约 4MB 的原始数据对此进行了测试。

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

*因为 Breeze 导入实体比创建完整的 4MB 原始数据加上这些实体的关联过程要快得多。
通过在背面完成所有繁重的工作,并且只在前面使用导入实体,breeze 允许您“轻而易举”处理大型数据集。

关于javascript - 带有专用网络 worker 的 BreezeJs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22132304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com