为什么异步代码在 Chrome 上的 Tampermonkey 中失败?

Why async code fails in Tampermonkey on Chrome?

此代码:

(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 次迭代。

我认为 promises 在 Tampermonkey 中不能正常工作。

已使用 chrome 74,Tampermonkey 4.8.41

有什么想法吗?

更新: 该错误不在承诺中。此代码也失败了:

(function() {
    'use strict';

    function doWork(){
        console.log(doWork.i++);
        setTimeout(doWork,1);
    }
    doWork.i=0;
    doWork();

})();

在 Opera 和 FF 中,一切都完美无缺。

更新: 无限循环仅供示例。但它在 node,chrome, FF 中测试了工作和内存泄漏。 我认为,它发生在一个 Tampermonkey 脚本中的许多(对我来说> 4k)异步调用。我会尽快尝试提供一些没有无限循环的代码。

它是 chrome 沙盒错误的 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);