new PromiseWorker(array => array.sort()).Invoke([3,2,1]).then(result => console.log(result));
new Worker("/JS/worker.js")
. hang the onmessage handler, call postmessage and stick to the same style in the worker file. In my opinion, it’s too bold to create a whole file for one function, and it’s no longer comfy to deal with event handlers. Good thing there are Blob and Promises already mentioned. var FnToWorker = fn => { var workerBody = "self.addEventListener('message'," + "function (d) {" + "var result;" + "try {" + "result = (" + fn.toString() + ")(d.data.Data);" + "self.postMessage({ Result: result, Id: d.data.Id });" + "} catch (e) {" + "self.postMessage({ Error: e, Id: d.data.Id });" + "}" + "});" var worker = new Worker(URL.createObjectURL(new Blob([workerBody]))); return worker; }
var promises = []; // var Invoke = data => { var message = { Data: data, Id: performance.now() }; // Id, var p = new Promise((resolve, reject) => { promises[message.Id] = { resolve: resolve, reject: reject }; }); worker.postMessage(message); // return p; }
var OnMessage = data => { if (data.data.Error) { promises[data.data.Id].reject(data.data.Result); } else { promises[data.data.Id].resolve(data.data.Result); } promises[data.data.Id] = undefined; }
Source: https://habr.com/ru/post/219037/
All Articles