2012-02-11 1 views
9

Ho un app che funziona bene scrivere con Requirejs e Backbonejs, ma è davvero rallentando a volte ... Per esempio, quando si tratta di fare qualche lavoro di aritmetica! Ho cercato di usare un Web Worker per fare questo lavoro aritmetica in questo modo:Come utilizzare i web worker in una build di modulo con Requirejs?

mio modulo (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 
}); 

Ma ho l'errore definire non è definito !!

ho provato come this troppo, ma senza successo !!

Come utilizzare Web Worker in requirejs o con backbonejs ??

Grazie!

risposta

12

È possibile utilizzare requireJS da lavoratori web: vedere la API docs per maggiori informazioni.

L'unico requisito è quello di caricare requireJS all'inizio del lavoratore web con importScripts(…). Una volta caricato, è possibile utilizzare define e utilizzare requireJS come normale.

La parte fondamentale per me quando mi è stato sempre al lavoro è stato quello di assicurarsi che si sta anche caricando la stessa configurazione di bootstrap (per esempio config.js o main.js) nella operaio web che si sta utilizzando nel resto della vostra applicazione. Questo è ciò che il dottore sta parlando quando dice:

È probabile che sia necessario impostare l'opzione di configurazione baseurl per assicurarsi che richiedono() riesce a trovare gli script da caricare.

Un'altra cosa è che si può caricare il lavoratore dal file traffic.js con un ID del modulo (al posto del hardcoding il percorso dello script) utilizzando this requireJS plugin.

+0

Sono in grado di ottenere il lavoratore web per caricare e iniziare, ma non risponde ai 'postMessage()' 'se l'addEventListener()' viene fatto all'interno della richiederà (funzione {}) '' blocco. Il listener di eventi del mio worker deve chiamare vari moduli requirejs. L'esempio nei documenti API che hai menzionato, vale a dire https://github.com/jrburke/requirejs/blob/master/tests/workers.js, non imposta alcun listener 'onmessage'. Qualche idea? – Fuhrmanator

+0

@Fuhrmanator In alternativa, è possibile impostare direttamente il gestore di eventi 'onmessage' (sebbene addEventListener sia sempre incoraggiato dai ninjas JavaScript). (Http://www.html5rocks.com/en/tutorials/workers/basics/). ** Se usi il plugin requireJS per i web worker, usa la sintassi onmessage, ** altrimenti, se il worker nativo non è disponibile, il file polyfill fake-worker.js incluso nel plugin non funzionerà. –

+1

@puro_nervio Sono stato in grado di farlo funzionare finalmente. Un esempio funzionante che ho trovato ha avuto l'operatore di fare un 'postMessage()' per rispondere al thread principale prima che facesse un 'addEventListener()'. Penso che il mio problema fosse che il thread non era pronto quando il mio thread principale gli stava dando lavoro. Il requirejs di diversi moduli richiede del tempo, quindi 'addEventListener' non è stato eseguito prima che il thread principale facesse il suo' postMessage() 'per dirgli di iniziare a fare qualcosa. In altre parole, il thread principale deve prima sincronizzarsi con esso. – Fuhrmanator