fandorin_official
@fandorin_official
Герой серии исторических детективов.

Как исправить остановку скрипта?

Всем добра.

Есть юзерскрипт (некоторые переменные и шелуху, не очень информативную, я выбросил):
(function (window, undefined) {  // [2] нормализуем window
    var w;
    if (typeof unsafeWindow != undefined) {
        w = unsafeWindow;
    } else {
        w = window;
    }
    if (w.self != w.top) {
        return;
    }

    function start() {
        var read = getread();
        checkResult(read);
    }

    function checkResult(last_read) {
        setTimeout(function() {
            if (last_read < getread()) {
                
            } else if (last_read > getread()) {

            } else {
                checkResult(last_read);
            }
        }, 500);
    }

    function getread() {
        var read_text = $('.read_select .chosen-single span').text();
        var regex = /[+-]?\d+(\.\d+)?/g;
        var floats = read_text.match(regex).map(function(v) {
            return parseFloat(v).toFixed(8);
        });
        return floats[0];
    }
    
    function minimum_rate() {
    }

    function callnetwork() {
    }
})(window);


Данный скрипт "парсит" онлайн чат одного сайта. Иногда на функции checkResult скрипт не может получить ответ от сайта и он выполняет третье условие и перезапускает функцию checkResult снова. И так может быть много раз. Иногда, после очередного десятка перезапуска срабатывает первое или второе условие и тогда все хорошо. Но порой, после многих десятков выполнений третьего условия скрипт "устает" и перестает выполнятся.

Как можно усовершенствовать скрипт, чтобы он не прерывался при некоторой задержки ответа от сайта?
  • Вопрос задан
  • 64 просмотра
Решения вопроса 1
rockon404
@rockon404
Frontend Developer
Иногда на функции checkResult скрипт не может получить ответ от сайта и он выполняет третье условие и перезапускает функцию checkResult снова.

Ерунда. Нет никакого ответа. Код синхронный(не считая setTimeout) и без запросов. Проверьте свои условия. Просто выведите в теле колбека setTimeout в консоль:
console.log(last_read);
console.log(getRead());
console.log(last_read < getread());
console.log(last_read > getread());

Наверняка там совсем не то, что вы задумали.
А скрипт ваш не "устает", а завершает свое выполнение. Кратчайший путь для завершения: start() -> getRead() -> checkResult() -> getRead()
Не знаю что вы задумали, но чтобы скрипт не останавливался достаточно после условий выполнять checkResult:
function checkResult(last_read) {
        setTimeout(function() {
            if (last_read < getread()) {
                
            } else if (last_read > getread()) {

            } else {
                checkResult(last_read);
            }

            checkResult(getRead());
        }, 500);
    }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы