Art*_*his 13 javascript web-worker jasmine karma-runner
我正在研究一个使用业力和茉莉花的小项目.我的目标浏览器是chrome 32.
我试图在我通过blob实例化的web worker中导入脚本,如下所示:
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);
});
});
});
Run Code Online (Sandbox Code Playgroud)
workerFactory如下:
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);
}
Run Code Online (Sandbox Code Playgroud)
其中createWorker是:
createWorker = function(sUrl)
{
return new Worker(sUrl);
}
Run Code Online (Sandbox Code Playgroud)
但是importScripts会抛出以下错误:
未捕获的SyntaxError:无法执行'importScripts':URL'/ base/SiteWeb/project/js/app/application.js'无效.
我试过浏览器中的路径:
http://mylocalhost:9876/base/SiteWeb/project/js/app/application.js
Run Code Online (Sandbox Code Playgroud)
它确实运作良好.
我应该使用什么路径使importScripts成功运行?
谢谢,
Woj*_*iak 23
您不能在使用Blob创建的worker中使用相对路径.
今天有这个问题.解决方案在"Web Worker的基础知识"中有解释,但文章的篇幅有点隐藏:
原因是:工作人员(现在从blob URL创建)将使用blob:前缀解析,而您的应用程序将从不同的(可能是http://)方案运行.因此,失败将归因于交叉来源限制.
如果您决定避免在您的工作人员中硬编码域名,那么该文章也提供了解决方案.在接收带有URL作为其参数之一的消息时导入脚本:
self.onmessage = function(e) {
importScripts(e.data.url + 'yourscript.js');
};
Run Code Online (Sandbox Code Playgroud)
并通过发送该网址启动您的工作人员
worker.postMessage({url: document.location.protocol + '//' + document.location.host});
Run Code Online (Sandbox Code Playgroud)
为清楚起见,上面的代码被简化.
归档时间: |
|
查看次数: |
3470 次 |
最近记录: |