2016-02-02 3 views
0

В настоящее время я создаю приложение, в котором пользователь может применять фильтр на изображениях. Во всяком случае, в зависимости от размера изображения сценарий для применения фильтра может занять много времени. Поэтому я хотел попробовать попробовать. (PHP не является альтернативой кстати)Доступ к готовым функциям с веб-работниками

Итак, сначала у меня есть функция, которая применяет фильтр, который работает просто отлично (за пределами рабочего) .so Вот код, у меня есть

Основной файла JavaScript, где Я определяю функцию и работник:

jQuery(function ($) 
{  

    var worker = "undefined"; 

    applyEffect(); 
    CreateWorker(worker); 
}); 

//function to apply the effect stands here 

/*-------------------*/ 
    /*WORKER*/ 
/*-------------------*/ 


//worker answers 
function defineWorker(worker) 
{ 
    worker.onmessage = function(e) 
    { 
     if(e.data == "msg from worker") 
     { 
      console.log(e.data); 
     } 
     worker.terminate(); 
    } 
} 


function CreateWorker(worker) 
{ 
    $("#filters li").click(function clickWorker() 
    { 
     if (typeof worker == "undefined") 
     { 
      worker.terminate() 
     } 
     else 
     { 
      console.log("worker created"); 
     } 
     worker = new Worker('js/worker.js'); 
     defineWorker(worker); 
     worker.postMessage("hello"); // Start the worker. 
    }); 
} 

и вот работник (worker.js):

self.onmessage = function(e) 
{ 
    if(e.data == "hello") 
    { 
     applyFilter(Argument1,Argument2,function() 
     { 
      self.postMessage('msg from worker' + $(window).width()); 
     }); 
    } 
} 

Когда я пытаюсь запустить рабочий с помощью мыши, я г et "ReferenceError: applyFilter не определен" ... то же самое касается jQuery-кода: "ReferenceError: $ не определен".

Я как бы понимаю проблему здесь, но я не знаю, как ее решить.

Я надеюсь, что кто-то может помочь мне :)

ответ

0

Каждый работник имеет собственный масштаб и не имеют доступа к государственным функциям, как ваш applyFilter() - метод. То же самое происходит с библиотеками и DOM. У рабочих нет DOM-Access, поэтому я думаю, что вы не можете использовать их для своей задачи здесь.

Дайте ему облизывание here

Действительный вариант будет хранить информацию о всех изображений в объекте и дать этот объект работника. Затем сам работник применяет некоторые теги или фильтры к объекту и отправляет его обратно к основному скрипту.

+0

Спасибо, я использую camanJs для фильтра, когда я включаю скрипт через importScripts. Я получаю сообщение об ошибке: «ReferenceError: window is not defined», поэтому, я думаю, я не могу использовать рабочего здесь, даже если я использую объект. – user2839873

+0

yep, потому что большинство оконных методов недоступны. Вы можете проверить возможные методы здесь: https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Functions_and_classes_available_to_workers – Fearodin

+0

спасибо, есть ли другой способ запустить сценарий в фоновом режиме? например, выполнить скрипт на сервере и вернуть URI данных? – user2839873

Смежные вопросы