Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function MyWorkerProxy(scriptUrl){
var performer = new Performer(scriptUrl);
this.firstFunction = function(params, callback){
performer.perform("firstFunction", params, callback);
}
...
}var myWorkerProxy = new MyWorkerProxy("myscript.js");
myWorkerProxy.firstFunction({some: "some"}, function(result){console.log("result1="+result);});
function Performer(scriptSource) {
var worker = new Worker(scriptSource), callbacks = {}, nextRequestId = 0;
var perform = function(functionName, params, callback) {
callbacks["request_" + (++nextRequestId)] = callback;
worker.postMessage(
{functionName: functionName, params: params, requestId: nextRequestId}
);
}
var self = this;
worker.onmessage = function(msg) {
if (msg.data.__methods__) { // получили список функций, делаем их методами Performer'a
var methods = msg.data.__methods__;
var appendMethod = function (name) {
self[name] = function (params, callback) {
perform(name, params, callback);
}
};
for (var i = 0; i < methods.length; ++i) {
appendMethod(method[i]);
}
}
else {
callbacks["request_" + msg.data.requestId](msg.data.result);
delete callbacks["request_" + msg.data.requestId];
}
}
perform('__init__');
}
onmessage = function (event) {
if (event.data.functionName === '__init__') {
var methods = [ // может и тут как–то можно автоматизировать?
'firstFunction',
'secondFunction'
...
];
postMessage({__methods__: methods });
}
else {
var requestId = event.data.requestId;
var workerFunction = eval(event.data.functionName);
var params = event.data.params;
var result = workerFunction(params);
postMessage({result: result, requestId: requestId});
}
}
function WorkerProxy(scriptSource) {
var self = this;
var worker = new Worker(scriptSource), callbacks = {}, nextRequestId = 0;
this.perform = function(functionName, params, successCallback, errorCallback) {
callbacks["request_" + (++nextRequestId)] =
{successCallback: successCallback, errorCallback: errorCallback};
worker.postMessage({functionName: functionName, params: params, requestId: nextRequestId});
}
worker.onmessage = function(msg) {
if (msg.data.__methods__) { // получили список функций, делаем их методами WorkerProxy
var methods = msg.data.__methods__;
for (var i = 0; i < methods.length; i++) {
eval('self["'+methods[i]+'"] = function (params, successCallback, errorCallback) {'
+'self.perform("'+methods[i]+'", params, successCallback, errorCallback);}');
}
return;
}
if(msg.data.error){
if( callbacks["request_" + msg.data.requestId].errorCallback){
callbacks["request_" + msg.data.requestId].errorCallback(msg.data.error);
}else{
alert(msg.data.error);
}
}else{
callbacks["request_" + msg.data.requestId].successCallback(msg.data.result);
}
delete callbacks["request_" + msg.data.requestId];
}
this.perform('__init__');
}
onmessage = function (event) {
if (event.data.functionName === '__init__') {
var methods = [];
for(var f in self){methods.push(f);}
postMessage({__methods__: methods });
return;
}
var requestId = event.data.requestId;
try{
var workerFunction = eval(event.data.functionName);
var params = event.data.params;
var result = workerFunction(params);
postMessage({result: result, requestId: requestId});
}catch(ex){
postMessage({error: ex + ", functionName="+event.data.functionName, requestId: requestId});
}
}
var myWorker = new WorkerProxy("myscript");
myWorker.firstFunction({some:"some"}, function(result){console.log("result1="+result);});
for(var f in self)
function MyWorker() {
this.firstFunction = function (params) {
// implementation
};
this.firstFunction = function (params) {
// implementation
};
// другие публичные методы, приватные методы и данные объявляются через var privateVariable, privateFunction
}
var myWorker = new MyWorker();
onmessage = function (event) {
if (event.data.functionName === '__init__') {
var methods = [];
for(var f in myWorker) {
if (myWorker.hasOwnProperty(f) && typeof f === 'function') { // вторая проверка, возможно, избыточна
methods.push(f);
}
}
postMessage({__methods__: methods });
return;
}
var requestId = event.data.requestId;
try{
var params = event.data.params;
var result = myWorker[event.data.functionName] (params);
postMessage({result: result, requestId: requestId});
}catch(ex){
postMessage({error: ex + ", functionName="+event.data.functionName, requestId: requestId});
}
}
alert(msg.data.error);
function WorkerProxy(scriptSource, publicWorkerFunctions) {
var self = this;
var methods = (typeof(publicWorkerFunctions) == "string") ? publicWorkerFunctions.split(",") : publicWorkerFunctions;
for (var i = 0; i < methods.length; i++) {
eval('self["'+methods[i]+'"] = function (params, successCallback, errorCallback) {'
+'self.perform("'+methods[i]+'", params, successCallback, errorCallback);}');
}
var worker = new Worker(scriptSource), callbacks = {}, nextRequestId = 0;
this.perform = function(functionName, params, successCallback, errorCallback) {
callbacks["request_" + (++nextRequestId)] =
{successCallback: successCallback, errorCallback: errorCallback};
worker.postMessage({functionName: functionName, params: params, requestId: nextRequestId});
}
worker.onmessage = function(msg) {
if(msg.data.error){
if( callbacks["request_" + msg.data.requestId].errorCallback){
callbacks["request_" + msg.data.requestId].errorCallback(msg.data.error);
}else{
alert(msg.data.error);
}
}else{
callbacks["request_" + msg.data.requestId].successCallback(msg.data.result);
}
delete callbacks["request_" + msg.data.requestId];
}
}
onmessage = function (event) {
var requestId = event.data.requestId;
try{
var workerFunction = eval(event.data.functionName);
var params = event.data.params;
var result = workerFunction(params);
postMessage({result: result, requestId: requestId});
}catch(ex){
postMessage({error: ex + ", functionName="+event.data.functionName, requestId: requestId});
}
}
var myWorker = new WorkerProxy("myscript", "firstFunction,secondFunction");
myWorker.firstFunction({some:"some"}, function(result){console.log("result1="+result);});
Оптимизация вызовов функций из воркеров (web-workers)