javascript - 超时正则表达式以避免灾难性的回溯
问题描述
如何在 JavaScript(运行时 = 浏览器)中为 Regex 调用添加超时,以免灾难性地回溯?我只找到了适用于NodeJS和其他语言的解决方案,但没有找到适用于 JavaScript 的解决方案。有谁知道一个好的解决方案?
解决方案
您可以在浏览器中启动 Web Worker,并随时终止它。以下示例演示了在工作人员完成运行它所拥有的所有内容之前终止它:
(出于演示目的,我正在从 blob 创建一个工作人员。此外,这是在 Chrome 中完成的,并且可能需要一些特定于浏览器的更改才能在其他浏览器中工作,例如这个问题中所示)
const workerScript = `
setTimeout(function () {
postMessage('You will see this');
}, 1000);
setTimeout(function () {
postMessage('You will NOT see this');
}, 5000);
`;
const blob = new Blob([workerScript], {type: 'application/javascript'});
const worker = new Worker(URL.createObjectURL(blob));
worker.onmessage = function(e) {
console.log(e.data);
};
// You will only see ONE log from the worker
// if you change the timeout (ex. 6000), you will see two
setTimeout(() => {
worker.terminate();
}, 3000);
推荐阅读
- python - 将情节静态图像生成从逆戟鲸更改为万花筒
- node.js - 如何在 Elasticsearch 中为文件夹中的每个文件获取一个新的 JSON 条目
- ios - 为什么我们可以将 flatMap 链接到 UserDefaults.standard.data
- excel - Excel中的外部引用字符串仅在从开头删除'后才变为公式,为什么以及如何重复数百次?
- python - TypeError:recognize() 接受 1 到 2 个位置参数,但给出了 3 个
- typescript - 如何通过 Jest 的异步方法测试
- c# - 如何在 RDLC ASP.net MVC C# 中生成二维码
- function - Julia:效率和指示参数类型
- php - 在配置文件用户中从 MySQL 打印用户数据
- node.js - nginx 更改上游服务器的端口检查