首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Chrome上的Tampermonkey中异步代码会失败?

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

Stack Overflow用户
提问于 2019-05-15 05:17:36
回答 1查看 1.7K关注 0票数 3

这段代码:

代码语言:javascript
复制
(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中用户脚本失败,并显示以下错误:

代码语言:javascript
复制
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

有什么想法吗?

更新:错误不在承诺中。下面的代码也会失败:

代码语言:javascript
复制
(function() {
    'use strict';

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

})();

在歌剧和FF中,所有这些都工作得很完美。

更新:无限循环仅用于示例。但是它在node,chrome,FF中的工作和内存泄漏进行了测试。我认为,它发生在许多(对我来说大于4k)的异步调用中。我将很快给出另一个没有无限循环的代码。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-21 19:28:07

chrome沙盒bug的代码是Tampermonkey。(可能是由这个chrome issue引起的)这个代码修复了它,直到这个问题在TM或Chrome中不会被修复。我使用了另一种注入方法:

代码语言:javascript
复制
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);
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56138740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档