Web Worker需要单独写一个js文件,使用起来比较麻烦,如果在主程序里动态创建,并能动态销毁的话,使用起来将会方便很多:

const create = f => {
    if(f instanceof Worker) return f;
    if(typeof f === 'string' && f.endsWith('.js')) return new Worker(f);
    if(typeof f === 'function') {
        const code = [
            `self.fn = ${f.toString()};`,
            'self.onmessage = (e) => {',
            ' const r = self.fn(e.data);',
            ' self.postMessage(r);',
            '}'
        ];

        const blob = new Blob(code, {type: 'text/javascript'});
        const url = URL.createObjectURL(blob);
        const worker = new Worker(url);

        worker.cleanup = () => {
            URL.revokeObjectURL(url);
            worker.terminate();
        };

        return worker;
    }
};

创建的worker实例添加了一个cleanup方法,用来关闭worker的同时,销毁url占用的内存。

参考链接:https://juejin.im/post/5e141875e51d454126369cf4



评论

提交取消回复
[face]@
[uname]  [add_time]
[content]
[reply]
加载更多评论