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);