[JavaScript] Projekt: JavaScript-Thread

Javascript:
var thr = new Thread([ "foo.js", "bar.js", square, { "square2": square2 }], ... );

Hiermit beziehst du dich wohl aber auf die erste Variante von mir?

Ich habe gerade probiert, das Importieren von externen Dateien auch zu erlauben.
In meiner Schleife, die über das übergebene Array iteriert:
Javascript:
// import external file
else if (typeof elem == "string") {
  code += "importScripts(\"" + elem + "\");\n";
}
Beim Ausführen des Codes (sowohl lokal als auch auf einem Server) bekomme ich immer folgenden Fehler:
Uncaught Error: SyntaxError: DOM Exception 12
Dieser tritt in der ersten Zeile des generierten WebWorker Codes auf, Beispiel:
Code:
importScripts("external.js"); // <----- genau hier
var send = function (data) { this.postMessage({data: data}); };this.addEventListener("message", function(evt) {var ret = (function (myData) {
		return square(myData);
	}).call(evt.target, evt.data);this.postMessage({data: ret, finished: true});}, false);

Weißt du, um was es sich da handelt?
 
Ja, weiß ich. Ich vermute, dass du in dem Skript irgendwo auf die DOM-API zugreifst, was Threads ausdrücklich verboten ist. Dementsprechend wird dort eine Exception geworfen.
 
Mh, ich hatte diesen Fehler bisher nur einmal, weil ich versucht habe jQuery zu importieren, und das baut logischerweise auf die DOM-API.
 
Bin gerade auf diese Seite gestoßen, welche folgendes schreibt:
A web worker can load additional scrips with importScripts(URL, ...). The URLs can be relative and, if so, are relative to the file doing the importing.
Relativ zu der WebWorker-Datei also. Nun haben wir ja überhaupt keine richtige Datei, sondern ein Blob-Objekt.
Das wirds wahrscheinlich sein!

Hast du bei dir schonmal Datei-Import getestet?

EDIT
Ja, das war es in der Tat. Als ich eine absolute URL auf der gleichen Domain angegeben habe, funktionierte der Import tadellos!!
 
Heißt das, dass eine URI mit führendem Slash bereits reicht, damit diese als absolute Pfadangabe gilt? Oder muss da auch die Domain mit angegeben werden?
 
Also ich habe es jetzt so gelöst, dass ich alle relativen Pfadangaben in absolute umwandle:
Javascript:
function absolute ( path, base ) {
    var parts = path.split( "/" ),
        stack = [],
        i;

    for ( i = 0; i < parts.length; ++i ) {
        if ( parts[ i ] === ".." ) {
            stack.pop();
        } else if ( parts[ i ] !== "." ) {
            stack.push( parts[ i ] );
        }
    }

    path = stack.join( "/" ).replace( /^[\/]+/, "" );
    return ( base == null ? "/" + path : base + "/" + path );
}
 
Jap, das ist mir auch schon eingefallen, doch die Eleganz, die man normalerweise bei relativen Angaben hätte, fehlt einfach.
Es gibt ja noch nicht mal Konstanten wie __FILE__ oder __DIR__ wie in PHP, sodass man den Pfad, wenn man die Datei verschiebt, manuell anpassen muss.

PS: Wieso eröffnet auf einmal jeder einen Thread im JS-Forum mit [ js ]?!
 
Zuletzt bearbeitet von einem Moderator:
Also ich bin gerade dabei das Problem so zu lösen, dass ich ein weiteres Skript habe, welches in jedem Thread über importScripts() geladen wird, und welche beim Erstellen des Skripts die Pfadangabe erhält und somit damit arbeiten kann. Ist zwar etwas umständlich, aber es funktioniert.

Zu deinem PS: Ich mach das schon immer so, weil ich zwischen JavaScript und jQuery unterscheide – ist zwar immer JavaScript, aber jQuery-Fragen unterscheiden sich doch gewaltig vom reinem JavaScript.
 
Zurück