Интервал SetimeOut завершается с ошибкой «Невозможно преобразовать неопределенный или нулевой объект» - PullRequest
5 голосов
/ 25 марта 2019

Я вхожу в пользовательский сценарий с помощью tampermonkey и не могу справиться с этой ошибкой, любая помощь будет полезна.

Я хорошо определяю ключи, пробел вызывает эту функцию, которая будет повторяться до тех пор, покаключ остается в нижнем положении.Консоль записывает вывод обычно в течение 30 секунд более или менее, а затем появляется ошибка типа.

В соответствии с ограничением репутации приведен скриншот:

Пользователь-Script:

// ==UserScript==
// @name         TEST STUFF--------------------
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  try to take over the world!
// @author       You
// @run-at         document-start
// @include        http://*
// @include        https://*
// @grant        none
// ==/UserScript==

( function()
{
    'use strict';
    window.addEventListener ( "keydown", CaptureKeyPress );
    window.addEventListener ( "keyup", CaptureKeyPress );
    var Hotkeys =
    {
        perform: 32
    };
    var HotkeyToggle = false;
    function CaptureKeyPress ( a )
    {
        if ( a.keyCode == Hotkeys.perform )
        {
            a.preventDefault();
            a.stopPropagation();
            a.cancelBubble = true;
            a.stopImmediatePropagation();

            if ( a.type == "keydown" && !HotkeyToggle )
            {
                console.clear();
                HotkeyToggle = true;
                perform();
            }

            if ( a.type == "keyup" && HotkeyToggle )
            {
                HotkeyToggle = false;
            }
        }
    }
    function perform()
    {
        if(HotkeyToggle == false) // exit
        {
            return 0
        }
        //do stuff...

        console.info("working...");
        if(HotkeyToggle == true) // continue after everything completes
        {
            setTimeout(() => {
                perform()
            }, 280);
            return 0
        }
        return 1
    }
} ) ();

Ответы [ 3 ]

4 голосов
/ 28 марта 2019

Это либо проблема, связанная с TamperMonkey, либо новая политика безопасности / ошибка в самом Chrome - я столкнулся с тем же и обнаружил это в отладчике, и ни один из аргументов не является нулевым / неопределенным; setTimeout не переопределяется.

Редактировать: Общая черта между рассматриваемым сценарием пользователя и тем, который я отлаживал, заключается в "рекурсивном" использовании setTimeout. Вместо этого я изменил его на setInterval, и это, кажется, исправило это в моем случае. enter image description here

3 голосов
/ 06 июня 2019

Это подтвержденная ошибка в Chrome:

Отмечено на TM github

Сообщается на сайте bugs.chromium.org

Другое решение, которое выглядит как работающее, - это .bind функции для window, например:

window.clearTimeout = window.clearTimeout.bind(window);
window.clearInterval = window.clearInterval.bind(window);
window.setTimeout = window.setTimeout.bind(window);
window.setInterval = window.setInterval.bind(window);

Ошибка должна быть исправлена ​​в Chrome 75.

2 голосов
/ 23 мая 2019

У меня была такая же проблема при использовании Tampermonkey и Google Chrome. Для меня работало использование window.setTimeout вместо setTimeout.

...