Подтвердить что ты не робот

Использование importScripts в Blob в среде кармы

Я работаю над небольшим проектом шахты, используя карму и жасмин. Мой целевой браузер - хром 32.

Я пытаюсь импортировать скрипты в веб-работника, которого я вызвал через blob следующим образом:

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 выглядит следующим образом:

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

где createWorker:

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

Но importScripts вызывает мне следующую ошибку:

Uncaught SyntaxError: Не удалось выполнить 'importScripts': не указан URL '/base/SiteWeb/project/js/app/application.js'.

Я пробовал путь в браузере:

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

и он работает хорошо.

Каков путь, который я должен использовать для успешной работы importScripts?

Благодаря,

4b9b3361

Ответ 1

Вы не можете использовать относительный путь для рабочего, созданного с помощью Blob.

Была эта проблема сегодня. Решение объясняется в "Основах веб-работников", но немного скрыто в длине статьи:

Причина заключается в том, что рабочий (теперь созданный из URL-адреса blob) будет разрешен с помощью blob: prefix, в то время как ваше приложение будет работать с другой (предположительно, http://) схемой. Следовательно, отказ будет связан с ограничениями на перекрестное происхождение.

Если вы решите избегать доменного имени hardcoding у своих сотрудников, в статье также есть решение для этого. Импортируйте свои сценарии при получении сообщения с URL как один из его параметров:

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

и начните свой рабочий с отправки этого URL-адреса

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

Для ясности приведенный выше код упрощен.