通过使用 Web Worker 在单独的线程中运行一个函数,允许长时间运行的函数不会阻塞 UI。
使用 Blob
对象URL创建一个新的Worker
,其内容应该是所提供函数的字符串化版本。
立即发送回调用函数的返回值。
返回一个 promise ,监听 onmessage
和 onerror
事件并解析 worker 发回的数据,或者抛出一个错误。
const runAsync = fn => { const blob = ` var fn = ${fn.toString()}; this.postMessage(fn()); `; const worker = new Worker( URL.createObjectURL(new Blob([blob]), { type: 'application/javascript; charset=utf-8' }) ); return new Promise((res, rej) => { worker.onmessage = ({ data }) => { res(data), worker.terminate(); }; worker.onerror = err => { rej(err), worker.terminate(); }; }); };
const longRunningFunction = () => { let result = 0; for (var i = 0; i < 1000; i++) { for (var j = 0; j < 700; j++) { for (var k = 0; k < 300; k++) { result = result + i + j + k; } } } return result; }; // NOTE: Since the function is running in a different context, closures are not supported. // The function supplied to `runAsync` gets stringified, so everything becomes literal. // All variables and functions must be defined inside. runAsync(longRunningFunction).then(console.log); // 209685000000 runAsync(() => 10 ** 3).then(console.log); // 1000 let outsideVariable = 50; runAsync(() => typeof outsideVariable).then(console.log); // 'undefined'
更多代码 JavaScript 实用代码片段 请查看 https://www.html.cn/30-seconds-of-code/
最新评论
写的挺好的
有没有兴趣翻译 impatient js? https://exploringjs.com/impatient-js/index.html
Flexbox playground is so great!
感谢总结。
awesome!
这个好像很早就看到类似的文章了
比其他的教程好太多了
柯理化讲的好模糊…没懂