2012-02-11 92 views
9

我有一個運行良好的應用程序,用Requirejs和Backbonejs編寫,但它有時真的很慢......例如,當進行一些算術運算時!我試圖使用Web工人做這樣該算法的工作:如何將Web Workers用於使用Requirejs的模塊構建?

我的模塊(traffic.js):

define(["jquery", "use!underscore", "use!backbone", "namespace" ], 
    function ($, _, Backbone, globals) { 
    ..... 
    var worker = new Worker("arithmetic.js"); 
    worker.addEventListener('message', function(e) { 
     console.log(e.data); 
    }, false); 

    worker.postMessage(globals.data); // Send data to our worker. 
    }); 

arithmetic.js:

define(["use!underscore", "use!backbone" ], 
    function ($, _) { 
     //Here die Operations 
}); 

但我有錯誤定義沒有定義!

我試過了,就像this也沒有成功!

如何將Web Worker用於requirejs或backbonejs?

謝謝!

回答

12

您可以使用web工作者的requireJS:有關更多信息,請參見API docs

唯一的要求是在網絡工作者的開始加載requireJS與importScripts(…)。一旦加載,你可以使用define並像普通一樣使用requireJS。

當我開始工作時,我的關鍵部分是確保您也正在加載相同的引導程序配置(例如config.jsmain.js)到您在其他應用程序中使用的web worker中。這就是文檔在說的內容:

您可能需要設置baseUrl配置選項以確保require()可以找到要加載的腳本。

另一件事是,你可以從你的traffic.js文件與模塊ID加載工人(而不是硬編碼的腳本路徑)利用this requireJS plugin

+0

我可以讓web worker加載並啓動,但如果addEventListener()在'require(function {})'塊內完成,它將不會響應'postMessage()'。我的工作者事件偵聽器需要調用各種requirejs模塊。您提到的API文檔中的示例(即https://github.com/jrburke/requirejs/blob/master/tests/workers.js)未設置任何「onmessage」偵聽器。有任何想法嗎? – Fuhrmanator 2015-10-11 20:36:40

+0

@Fuhrmanator或者,您可以直接設置onmessage事件處理程序(儘管addEventListener總是受到JavaScript ninjas的鼓勵)。 (http://www.html5rocks.com/en/tutorials/workers/basics/)。 **如果爲web工作人員使用requireJS插件,請使用onmessage語法,** otherwhise如果本地worker不可用,插件中包含的polyfill fake-worker.js將不起作用。 – 2015-10-19 14:27:29

+1

@puro_nervio我終於可以讓它工作了。我發現一個工作示例讓worker在執行'addEventListener()'之前執行'postMessage()'來回復主線程。我想我的問題是,當我的主線程正在完成工作時線程還沒有準備好。幾個模塊的requirejs需要一些時間,所以'addEventListener'在主線程執行它的'postMessage()'來告訴它開始做某事之前沒有被執行。換句話說,主線程必須先與它同步。 – Fuhrmanator 2015-10-19 15:25:03