快速将复杂操作放入Web Worker中执行(避免卡住网页),无需另外的js文件。
传入要运行的函数(可以是async函数)和给与的参数即可。
注意函数运行在独立环境,变量要通过参数传递,且只能传递可序列化数据。

使用示例:

let result = await runInWorker((a, b)=>{
    return a+b;
}, 1, 2);
result; // 3

代码:

function runInWorker(f, ...args) {
    return new Promise((resolve, reject) => {
        let js = `
(function(f){
    self.onmessage = ({data})=>{
        if(data.type=="run-with-args"){
            (async ()=>{
                try{
                    let r = await f(...data.args);
                    self.postMessage({
                        type: "result",
                        result: r
                    });
                }catch(e){
                    self.postMessage({
                        type: "error",
                        error: e
                    });
                }
                
            })();
        }
    }
})(${f.toString()});
        `;
        let worker = new Worker(URL.createObjectURL(new Blob([js], {
            type: 'text/plain'
        })));
        worker.onmessage = ({ data }) => {
            if (data.type == "result") {
                resolve(data.result);
                worker.terminate(); // terminate 之后不方便调试
            }
            else if (data.type == "error") {
                reject(data.error);
                worker.terminate();
            }
        }
        worker.postMessage({
            type: "run-with-args",
            args
        });
    }
    );
}

前段时间工具箱里添加了一个正则测试的工具(这里),不同于一般的测试工具,里面加入了一个可以显示子匹配(小括号里的)的内容的功能,因为原生js正则无法提供子匹配的位置,所以手动写了解析正则的代码,来提供获取子匹配位置的功能。
今天突然发现了一个很专业的网站:regex101,也提供了显示子匹配位置的功能,并且异常的相似,除此之外还提供了非常多的其他的正则相关功能。
忽然就想是不是js有原生提供这个功能,找了一会还是没有找到。
如果有提供我可是真的百忙一场了哈哈哈😂

过段时间有心情的时候想把这个功能的代码整理一下提供出来,贴到github上,补充下原生正则功能。