我正在尝试从blob创建一个Web worker:
var workerUrl = URL.createObjectURL(new Blob(["console.log('inside worker')"], {type: "text/javascript"}));
var worker = new Worker(workerUrl);
URL.revokeObjectURL(workerUrl);
此代码在Chrome和Firefox中运行良好,但在Edge中运行时,我在JavaScript控制台中收到此错误:
SEC7111: HTTPS security is compromised by blob:https://example.com/b6996513-0a45-443b-b163-1fb2a77ac2a8
此外,“内部工人”永远不会被打印出来。
如何让这段代码在Edge中正常工作?
答案 0 :(得分:1)
虽然我并不完全了解相互作用,但这似乎是由于竞争条件导致blob在创建Web工作者之前被撤销。
将URL.revokeObjectURL()
置于setTimeout()
内且有足够的延迟可以解决问题:
var workerUrl = URL.createObjectURL(new Blob(["console.log('inside worker')"], {type: "text/javascript"}));
var worker = new Worker(workerUrl);
setTimeout(function() {
URL.revokeObjectURL(workerUrl);
}, 500); // you may have to increase the delay here
更高级的解决方案是将工作人员内部的添加到postMessage()
返回主页,触发对URL.revokeObjectUrl()
的调用。这可能是“正确”的方法,但上面的解决方法明显更简单。