2016-04-25 5 views
1

Momentan arbeite ich an der Portierung einer vorhandenen Webanwendung auf require.js. Die meisten Dinge scheinen zu funktionieren, aber die Funktionalität, die Web-Arbeiter verwendet. Zum Beispiel hatte ich einen Arbeiter, in einer separaten js-Datei definiert MeshLoader.js, die ein 3D-Modell aus einer STL-Datei lädt:Wie kann require.js mit Web-Arbeitern verwendet werden?

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, 
    }); 
} 

Eine kleine Bemerkung: STLLoader.js Modul ist ein three.js Plugin, die STLLoader Objekt definiert und fügt sie zu THREE Namensraum. Dies ist, wie ich schrieb es mit 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; 
}); 

Der Arbeiter die folgende Art und Weise genannt wird:

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') { 
     // ... 
    } 
}; 

Also, das Problem ist, es der Arbeiter scheint überhaupt nicht genannt wird. Vielleicht muss ich es als Modul im requirejs.config() Abschnitt erklären und dann das Modul als eine Abhängigkeit zu anderen Modulen hinzufügen, die diesen Arbeiter aufrufen?

+0

Es ist unklar, was Ihr Problem ist, redundante Debug-Informationen fehlen. Ich gab Ihnen allgemeine Antwort in meiner Antwort, die das Problem zuverlässig löst (funktioniert hier zum Beispiel: http://darker.github.io/asteroids/demo-simple-bounce/ –

Antwort

3

Ich benutze es so (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"); 
} 

Beachten Sie, dass es ist nur, nachdem Sie "worker_loaded" erhalten, dass Sie Nachrichten an die Arbeitnehmer Beiträge schreiben können, denn nur dann wird die Nachricht akzeptiert. Zuvor ist der Rückruf onmessage noch nicht eingerichtet. So sollte Ihr Hauptcode aussehen:

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

Wenn Sie mich wissen lassen, was genau fehlt, ich Ich werde meine Frage aktualisieren. "Redundante Debug-Info" ist ziemlich vage. Allerdings sehe ich, dass Sie require.js mit Ihren Mitarbeitern anders verwenden: 1. Sie haben eine 'Config'-Sektion in einer Datei mit einem Arbeiter ; 2. Sie rufen 'requires' anstatt' 'requires' 'an, um den Arbeiter zu initialisieren. Ich werde versuchen, dasselbe mit einem meiner Mitarbeiter zu tun. – Ivan

+0

Ich denke, es ist kein signifikanter Unterschied - Sie haben gerade die Konfig übergeben in den Request Request. Rendundant info ist info Ich muss dein Problem diagnostizieren und es testen Ich werde dir nicht tausend Fragen in den Kommentaren stellen - sorry Ich bin verbittert geworden, viele Fragen zu stellen, um Fragen zu klären. Hier ist, was ist das Beste, was Sie tun können: http://sscce.org/ Meiner Erfahrung nach, finde ich in 70% Fällen Lösung, während ich Sscce mache, sobald ich die Unklarheit von meinem Code entferne. –

+0

Guter Punkt, ich werde versuchen, den Arbeiter zu isolieren, und sehen, ob ich etwas neues bekomme. – Ivan