2014-03-04 5 views
11

Ich arbeite an einem kleinen Projekt von mir mit Karma und Jasmin. Mein gezielte Browser ist Chrom 32.Verwendung von importsScripts in Blob in einer Karma-Umgebung

Ich versuche, Skripte innerhalb einer Web-Arbeiter zu importieren, die ich durch einen Klecks instanziiert haben sich wie folgt:

describeAsyncAppliPersephone("When the application project to DOM", function() 
{ 
    it("it should call the function of DomProjection in the project associated with its event", function() 
    { 
     var eventSentBack = { 
      eventType: 'testReceived', 
      headers: { id: 14, version: 4 }, 
      payLoad: { textChanged: 'newText' } 
     }; 
     var isRendered = false; 
     var fnProjection = function(event, payload) 
     { 
      isRendered = true; 
     } 

     var bootstrap = [ 
      { eventType: 'testReceived', projection: fnProjection }, 
      { eventType: 'test2Received', projection: function() { } } 
     ]; 

     runs(function() 
     { 
      var factory = new WorkerFactory(); 

     var worker = factory.CreateByScripts('importScripts("/base/SiteWeb/project/js/app/application.js"); var app = new application(self); app.projectOnDOM(' + JSON.stringify(eventSentBack) + '); '); 

      console.log(worker.WorkerLocation); 

      var applicationQueue = new queueAsync(worker); 
      var projectQueue = new queueSync(worker); 
      var p = new project(applicationQueue, persephoneQueue, bootstrap); 

      applicationQueue.publish(eventSentBack); 
     }); 

     waitsFor(function() { return isRendered }, "Projection called", 500); 

     runs(function() 
     { 
      expect(isRendered).toBe(true); 
     }); 


    }); 
}); 

workerFactory ist wie folgt:

this.CreateByScripts = function(scripts, fDefListener, fOnError) 
    { 
     var arrayScripts = scripts; 

     if (!arrayScripts) 
      throw "unable to load worker for undefined scripts"; 

     if (Object.prototype.toString.call(arrayScripts) !== '[object Array]') 
      arrayScripts = [arrayScripts]; 

     var blob = new Blob(arrayScripts, { type: "text/javascript" }); 

     var w = createWorker(window.URL.createObjectURL(blob)); 

     return new QueryableWorker(w, fDefListener, fOnError); 
    } 

wo createWorker ist:

createWorker = function(sUrl) 
     { 
      return new Worker(sUrl); 
     } 

Aber die ImportScripts wirft mir die folgenden ng Fehler:

Uncaught SyntaxError: Failed to execute 'importScripts': the URL '/base/SiteWeb/project/js/app/application.js' is invalid.

ich mit dem Pfad im Browser versucht:

http://mylocalhost:9876/base/SiteWeb/project/js/app/application.js 

und es gut funktioniert.

Welchen Pfad sollte ich verwenden, damit importScripts erfolgreich funktioniert?

Danke,

Antwort

17

Sie nicht relativen Pfad in Arbeiter mit Blob erstellt verwenden können.

Hatte dieses Problem heute. Die Lösung wird in "The Basics of Web Workers" erklärt, aber ein wenig in der Länge des Artikels versteckt:

The reason being: the worker (now created from a blob URL) will be resolved with a blob: prefix, while your app will be running from a different (presumably http://) scheme. Hence, the failure will be due to cross origin restrictions.

Wenn Sie den Artikel bestimmt zu vermeiden, hat auch eine Lösung für diesen hartzucodieren Domain-Namen in Ihren Mitarbeitern. Importieren Sie Ihre Skripte auf Empfangen einer Nachricht mit der URL als einen seiner Parameter:

self.onmessage = function(e) { 
    importScripts(e.data.url + 'yourscript.js'); 
}; 

und starten Sie Ihre Arbeiter mit dieser URL zu senden

worker.postMessage({url: document.location.protocol + '//' + document.location.host}); 

Der obige Code ist aus Gründen der Klarheit vereinfacht.

+0

brilliant !!! Ich habe eine Lösung gefunden, aber es war ein bisschen hacky als deins .... Einen schönen Tag !!! – Arthis

+0

Ich glaube, es sollte "document.location.protocol" bzw. "document.location.host" sein. –

Verwandte Themen