为什么异步代码在 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);
此代码:
(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);