Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在web workers中使用require.js的正确方法是什么?_Javascript_Three.js_Requirejs_Web Worker - Fatal编程技术网

Javascript 在web workers中使用require.js的正确方法是什么?

Javascript 在web workers中使用require.js的正确方法是什么?,javascript,three.js,requirejs,web-worker,Javascript,Three.js,Requirejs,Web Worker,目前,我正在将现有的web应用程序移植到require.js。大多数东西似乎都能正常工作,但使用web workers的功能却无法正常工作。例如,我有一个worker,在单独的js文件MeshLoader.js中定义,它从STL文件加载3D模型: importScripts('../lib/three.min.js', '../lib/STLLoader.js'); onmessage = function(e) { var blob = e.data; var reader

目前,我正在将现有的web应用程序移植到require.js。大多数东西似乎都能正常工作,但使用web workers的功能却无法正常工作。例如,我有一个worker,在单独的js文件MeshLoader.js中定义,它从STL文件加载3D模型:

importScripts('../lib/three.min.js', '../lib/STLLoader.js');

onmessage = function(e) {
    var blob = e.data;
    var reader = new FileReaderSync();
    readContents(reader.readAsArrayBuffer(blob));
};

function readContents(contents) {
    try {
        var geometry = new THREE.STLLoader().parse(contents);
    } catch (e) {
        // error handling
    }

    var attributes = {};
    // parsing the file is going on here
    // ...

    postMessage({
            status: 'completed',
            attributes: attributes,
    });
}
一个小提示:STLLoader.js模块是一个三个.js插件,它定义STLLoader对象并将其添加到三个命名空间中。我就是这样用require.js重写的:

工人被称为以下方式:

var worker = new Worker('js/workers/MeshLoader.js');
worker.postMessage(blob);
worker.onmessage = function (event) {
    if (event.data.status == 'completed') {
        // ...
    } else if (event.data.status == 'failed') {
       // ...
    } else if (event.data.status == 'working') {
       // ...
    }
};
所以,问题是工人似乎根本没有接到电话。也许我需要在requirejs.config部分将其声明为一个模块,然后将该模块作为依赖项添加到调用此worker的其他模块中?

我这样使用它:

请注意,只有在收到已加载的worker_之后,您才能向worker发布消息,因为只有这样消息才会被接受。在此之前,尚未建立onmessage回调。因此,您的主代码应该如下所示:

var worker = new Worker("myworker.js");
worker.onmessage = function(e) {
  if(e.data=="worker_loaded") { 
    // Tell worker to do some stuff
  }
}
我是这样使用它的:

请注意,只有在收到已加载的worker_之后,您才能向worker发布消息,因为只有这样消息才会被接受。在此之前,尚未建立onmessage回调。因此,您的主代码应该如下所示:

var worker = new Worker("myworker.js");
worker.onmessage = function(e) {
  if(e.data=="worker_loaded") { 
    // Tell worker to do some stuff
  }
}

不清楚您的问题是什么,缺少冗余调试信息。我在回复中给出了一般性的答案,它可靠地解决了这里的问题。例如:不清楚您的问题是什么,缺少冗余的调试信息。在我的回复中,我给了你一个大致的答案,这个答案可靠地解决了这里的问题。例如:如果你让我知道到底缺少什么,我会更新我的问题。冗余调试信息是非常模糊的事情。但是,我发现您对工作人员使用require.js的方式有所不同:1。您在一个文件中有一个配置节,其中包含一个工作进程;2.您可以调用requirejs而不是require来初始化worker。我将尝试对我的一个工作人员做同样的事情。我认为这并没有什么显著的区别-您只是将配置传递到require调用中。Rendundant信息是我需要诊断您的问题并进行测试的信息。我不会在评论中问你上千个问题——对不起,我已经因为问了大量的评论来澄清问题而变得痛苦。以下是您能做的最好的事情:根据我的经验,70%的情况下,当我消除代码中的模糊性时,我会在制作sscce时找到解决方案。很好,我会尝试隔离工作人员,看看是否有新的smth。谢谢!在我研究了你的项目之后,我设法解决了这个问题。主要的问题是,在构建worker之后,我就开始向它发送消息。它过去在没有require.js的情况下工作,其中worker初始化是同步的,但现在不是这样。因此,我添加了从worker发送额外消息,以向主线程报告其就绪状态,然后主线程开始发送消息。我想我应该强调一下,这就是为什么在我的示例中发送消息的原因。很好地解决了这个问题,祝项目顺利:如果你让我知道到底缺少什么,我会更新我的问题。冗余调试信息是非常模糊的事情。但是,我发现您对工作人员使用require.js的方式有所不同:1。您在一个文件中有一个配置节,其中包含一个工作进程;2.您可以调用requirejs而不是require来初始化worker。我将尝试对我的一个工作人员做同样的事情。我认为这并没有什么显著的区别-您只是将配置传递到require调用中。Rendundant信息是我需要诊断您的问题并进行测试的信息。我不会在评论中问你上千个问题——对不起,我已经因为问了大量的评论来澄清问题而变得痛苦。以下是您能做的最好的事情:根据我的经验,70%的情况下,当我消除代码中的模糊性时,我会在制作sscce时找到解决方案。很好,我会尝试隔离工作人员,看看是否有新的smth。谢谢!在我研究了你的项目之后,我设法解决了这个问题。主要的问题是,在构建worker之后,我就开始向它发送消息。它过去在没有require.js的情况下工作,其中worker初始化是同步的,但现在不是这样。因此,我添加了从worker发送额外消息,以向主线程报告其就绪状态,然后主线程开始发送消息。我想我应该强调一下,这就是为什么在我的示例中发送消息的原因。很好地解决了这个问题,祝项目顺利:
var worker = new Worker("myworker.js");
worker.onmessage = function(e) {
  if(e.data=="worker_loaded") { 
    // Tell worker to do some stuff
  }
}