Javascript 为什么Chrome上的Tampermonkey中异步代码失败?
此代码:Javascript 为什么Chrome上的Tampermonkey中异步代码失败?,javascript,google-chrome,tampermonkey,Javascript,Google Chrome,Tampermonkey,此代码: (async ()=>{ let i=0; while (1) { await sleep(1); console.log(i++); } })(); function sleep(ms){ return new Promise(function (resolve, reject) { setTimeout(()=>{ resolve(); },ms);
(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中,userscript失败:
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)
在歌剧和FF中,这一切都非常完美
更新:
无限循环只是一个例子。但它在node、chrome和FF中进行了工作和内存泄漏测试。
我认为,在一个脚本中有许多(>4k)异步调用时就会发生这种情况。我很快会尝试给出一些没有无限循环的代码。这是chrome沙盒bug的篡改猴子。 (可能是这个原因) 这段代码修复了它,直到这个问题不会在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);
您的代码在Firefox+Tampermonkey 4.9中运行良好。在FF works中似乎运行良好,我最近也尝试过。感谢您运行脚本。Chrome+Tampermonkey中的
setTimeout
也存在此问题,可能是一个Tampermonkey bug,也可能是Chrome bug。您的代码在Chrome+Tampermonkey中对我有效,我看不出有任何理由不应该出现此问题(除了前面提到的任何一个bug)。问题是代码(两组)正在吞噬内存,直到它所在的沙箱崩溃。在某些环境中,这种情况发生得更快,但糟糕得令人厌恶的代码是不可忽视的。不要写无用的无限循环。如果计划了多个迭代,则使用setInterval()。
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);