Почему в Tampermonkey на Chrome происходит сбой асинхронного кода? - PullRequest
1 голос
/ 15 мая 2019

Этот код:

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

после почти 3 тыс. Итераций.

Я думаю, что обещанияне работает правильно в Tampermonkey.

Используется Chrome 74, Tampermonkey 4.8.41

Есть идеи?

Обновление: Ошибка не вобещаю.Этот код тоже не работает:

(function() {
    'use strict';

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

})();

В опере и FF все работает отлично.

Обновление: Бесконечные циклы только для примера.Но это было проверено на работоспособность и утечки памяти в узлах, chrome, FF.Я думаю, это происходит со многими (> 4k для меня) асинхронными вызовами в одном скрипте Tampermonkey.Попробую дать какой-нибудь другой код без бесконечных циклов.

1 Ответ

0 голосов
/ 21 мая 2019

Это Tampermonkey для хромовой песочницы.(может быть вызвано этой проблемой chrome ). Этот код исправляет ее, пока проблема не будет исправлена ​​в 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);
...