嵌入式 Web workers

前言

虽然worker可以将复杂的运算放入单独线程去运算,不阻塞UI线程,但是,由于worker()的构造函数的参数不能读取本地的文件,只能来自网络,所以当在一个项目里想使用本地的模块函数,是一个很麻烦的过程,官方的方法也没有提供方便的做法。

 

解决方法

将函数转换为blob,然后生成URL对象。

function fn2workerURL(fn) {
  var blob = new Blob(['('+fn.toString()+')()'], {type: 'application/javascript'})
  return URL.createObjectURL(blob)
}

这样就可以直接在调用本地模块文件了。

 

demo

// worker.js
function scope() {
  function timedCount(e) {
    postMessage(e - 0 + 1);
  }

  onmessage = function (oEvent) {
    console.error('worker error ', oEvent);

    timedCount(oEvent.data);
  };
}

function fn2workerURL(fn) {
  var blob = new Blob(['(' + fn.toString() + ')()'], {type: 'application/javascript'});
  return URL.createObjectURL(blob);
}

export default fn2workerURL(scope);
// main.js
...

import workerUrl from './worker.js';

startWorker = () => {
    if (typeof(Worker) !== 'undefined') {
      if (!w) {
        w = new Worker(workerUrl);
      }

      w.postMessage('1');

      w.onmessage = function (event) {
        console.error('worker message: ', event.data);
      };
    } else {
      alert('dont support worker');
    }
};

 

posted @ 2018-11-19 15:22  南辰_k  阅读(363)  评论(0编辑  收藏  举报