2016-04-25 75 views
1

目前,我正在将现有的Web应用移植到require.js。大多数事情似乎都有效,但是使用网络工作者的功能。例如,我有一个工人,在一个单独的JS文件MeshLoader.js定义的,即从一个STL文件加载的3D模型:与网络工作者一起使用require.js的正确方法是什么?

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模块是three.js插件限定STLLoader对象,并将它到THREE命名空间。这就是我如何与require.js重写了它:

importScripts('../lib/require.min.js'); 

require({ 
    baseUrl: '../lib' 
}, [ 
    'require', 'three.min', 'stlloader' 
], 
function(require, THREE, STLLoader) { 
    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 = {}; 
     // same code as in the initial version 
     // ... 

     postMessage({ 
      status: 'completed', 
      attributes: attributes, 
     }); 
    } 

    return onmessage; 
}); 

工人被称为以下方式:

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的模块中?

+0

目前尚不清楚你的问题是什么,冗余调试信息丢失。我在回复中给出了一般答案,它可以可靠地解决问题(例如:http://darker.github.io/asteroids/demo-simple-bounce/ –

回答

3

我这样使用它(jsfiddle):

importScripts("require.js"); 
requirejs.config({ 
    //Lib path 
    baseUrl: '.', 
    // Some specific paths or alternative CDN's 
    paths: { 
     "socket.io": [ 
      "//cdn.socket.io/socket.io-1.3.7", 
      "socket.io.backup"] 
    }, 
    waitSeconds: 20 
}); 


requirejs(["LibName"], (TheLibrary) = > { 
    // code after all is loaded 
    self.onmessage = (msg)=>{ 
    // do stuff 
    TheLibrary.doStuff(msg.data); 
    } 
    // I tend to dispatch some message here 
    self.postMessage("worker_loaded"); 
} 

需要注意的是收到"worker_loaded",你可以发布消息的工人,因为只有这样的消息将被接受后,才。之前,onmessage回调尚未建立。所以你的主代码应该看起来如下:

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

如果你让我知道什么是缺少的,我我会发现你的工作人员使用require.js的方式不同: 1.你在一个带有worker的文件中有一个“config”部分; 2.你调用'requirejs'而不是'require'来初始化工作人员 我会尽力对我的一个工作人员做同样的事情 – Ivan

+0

我认为这不是显着差异 - 你只是通过配置进入'require'调用。冗余信息是我需要诊断你的问题并进行测试的信息。我不会在评论中问你几千个问题 - 对不起我越来越多地提出了许多意见来澄清问题。以下是你可以做的最好的事情:http://sscce.org/根据我的经验,70%的案例中,一旦我从我的代码中删除了默默无闻的代码,我就可以找到解决方案。 –

+0

好点,我会尝试隔离工人,看看我是否有新的。 – Ivan

相关问题