这段代码:
(async ()=>{
let i=0;
while (1) {
await sleep(1);
console.log(i++);
}
})();
function sleep(ms){
return new Promise(function (resolve, reject) {
setTimeout(()=>{
resolve();
},ms);
})
}
在浏览器中可以正常工作,但在Tampermonkey中用户脚本失败,并显示以下错误:
Uncaught (in promise) TypeError: Cannot convert undefined or null to object
at eval (userscript.html?id=4ef091f1-f006-441d-bf58-4bd22750f636:24)
at new Promise (<anonymous>)
at sleep (userscript.html?id=4ef091f1-f006-441d-bf58-4bd22750f636:23)
at eval (userscript.html?id=4ef091f1-f006-441d-bf58-4bd22750f636:18)
在近3k次迭代之后。
我认为承诺不能在坦帕猴子中正常工作。
使用chrome 74,Tampermonkey 4.8.41
有什么想法吗?
更新:错误不在承诺中。下面的代码也会失败:
(function() {
'use strict';
function doWork(){
console.log(doWork.i++);
setTimeout(doWork,1);
}
doWork.i=0;
doWork();
})();
在歌剧和FF中,所有这些都工作得很完美。
更新:无限循环仅用于示例。但是它在node,chrome,FF中的工作和内存泄漏进行了测试。我认为,它发生在许多(对我来说大于4k)的异步调用中。我将很快给出另一个没有无限循环的代码。
发布于 2019-05-21 19:28:07
chrome沙盒bug的代码是Tampermonkey。(可能是由这个chrome issue引起的)这个代码修复了它,直到这个问题在TM或Chrome中不会被修复。我使用了另一种注入方法:
var scriptText=`
/* some code fails with this bug */
`;
var newScript = document.createElement("script");
var inlineScript = document.createTextNode(scriptText);
newScript.appendChild(inlineScript);
document.body.appendChild(newScript);
https://stackoverflow.com/questions/56138740
复制相似问题