Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.01.2018, 12:59
Интересующийся
Отправить личное сообщение для antonhauff Посмотреть профиль Найти все сообщения от antonhauff
 
Регистрация: 16.10.2017
Сообщений: 23

Скрипт некорректно работает. Как можно исправить?
Есть юзерскрипт (некоторые переменные и шелуху, не очень информативную, я выбросил):
(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()) {
        //1-ый блок
        } else if (last_read > getread()) {
        //2-ый блок
        } else {
        //3-ый блок
        checkResult(last_read);
        }
    }, 500);
}

function getread() {
}

function minimum_rate() {
}

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


Данный скрипт парсит онлайн чат некоторого сайта. Иногда на функции checkResult скрипт не может получить ответ от сайта. В таком случае выполняет третье условие (третий блок) и перезапускает функцию checkResult() снова. И так может быть несколько раз. Но порой, после неоднократного повторения третьего блока функции checkResult() в консоле можно увидеть ошибку "Failed to load resource: the server responded with a status of 429 ()" либо какой-нибудь другую (например иногда это может быть 500(), либо 502()). В таком случае, скрипт "зависает" на бесконечном выполнении третьего блока функции checkResult().

Подскажите пожалуйста, как можно поправить логику скрипта, чтобы не возникала такая ошибка?
Ответить с цитированием
  #2 (permalink)  
Старый 15.01.2018, 13:17
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

antonhauff,
Не знаю, что у вас в функции getread(), но я бы вынес обращение к ней повыше - чтобы оно шло один раз за цикл анализа результата

function checkResult(last_read) {
    setTimeout(function() {
        var readresult = getread();
        if (last_read < readresult) {
        //1-ый блок
        } else if (last_read > readresult) {
        //2-ый блок
        } else {
        //3-ый блок
        checkResult(last_read);
        }
    }, 500);
}

При двух отдельных вызовах могут быть разные результаты, и логика проверки нарушается

Последний раз редактировалось Dilettante_Pro, 15.01.2018 в 13:19.
Ответить с цитированием
  #3 (permalink)  
Старый 15.01.2018, 13:18
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Слишком много выкинуто.
Откуда берётся last_read? Что выдаёт getread()?
Очевидно, что last_read навсегда остаётся равным getread(), а почему это происходит, без представления откуда что берётся, не скажут и телепаты.
__________________
29375, 35
Ответить с цитированием
  #4 (permalink)  
Старый 15.01.2018, 13:25
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Aetae,
Сообщение от Aetae
Очевидно, что last_read навсегда остаётся равным getread()
Откуда это очевидно? Это присвоение указано только в функции start.
Когда вызывается функция start?
Что возвращает функция getread() при последующих вызовах?

Сообщение от antonhauff
некоторые переменные и шелуху, не очень информативную, я выбросил
И ребенка вместе с водой....
Ответить с цитированием
  #5 (permalink)  
Старый 15.01.2018, 13:30
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,590

Сообщение от Dilettante_Pro Посмотреть сообщение
Откуда это очевидно?
Из того что тетий блок выполняется постоянно, а выше проверятся условие как > так и <. *пожал плечами*
Конечно и last_read и возврат getread() как-то могут меняться(сомневаюсь), но так или иначе last_read остаётся равным getread().
__________________
29375, 35
Ответить с цитированием
  #6 (permalink)  
Старый 15.01.2018, 13:43
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

Aetae,
Сообщение от Aetae
возврат getread() как-то могут меняться(сомневаюсь), но так или иначе last_read остаётся равным getread()
Это только гадание на кофейной гуще, но, предположительно:
- last_read задаётся равным getread() в функции start
- функция checkResult крутится и ждет, когда изменится getread()

Конечно, если в функции start вызов getread() сразу даст окончательный результат ... то ждать можно до бесконечности
Ответить с цитированием
  #7 (permalink)  
Старый 15.01.2018, 19:46
Интересующийся
Отправить личное сообщение для antonhauff Посмотреть профиль Найти все сообщения от antonhauff
 
Регистрация: 16.10.2017
Сообщений: 23

Вернул "шелуху" которая взаимодействует с сайтом
(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();
    $('.read_htable input[name=bet]').val(parseFloat(current_bet).toFixed(8));
        read_on = callnetwork();
        var readBtn = $('.read_htable .clRead')[read_on];
        readBtn.click();
        checkResult(read);
}

function checkResult(last_read) {
    setTimeout(function() {
        if (last_read < getread()) {
        //1-ый блок
        } else if (last_read > getread()) {
        //2-ый блок
        } else {
        //3-ый блок
        checkResult(last_read);
        }
    }, 500);
}

function getread() {
        var write_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.

Я так понимаю, тогда надо как-то отследить есть ли изменения после нажатия кнопки? Как это можно сделать?
Ответить с цитированием
  #8 (permalink)  
Старый 15.01.2018, 19:52
Интересующийся
Отправить личное сообщение для antonhauff Посмотреть профиль Найти все сообщения от antonhauff
 
Регистрация: 16.10.2017
Сообщений: 23

Немного не так. Если после нажатия кнопки (код я добавил, он находится в функции start()) в чате произошли изменения, то last_read не равен getread(). Но порой, кнопка нажимается долго (сайт подлагивает) и в таком случае ,дальнейший код выполняется быстрее чем появляюься изменения в чате и тогда last_read равен getread() и мы попадаем в третий блок.
Ответить с цитированием
  #9 (permalink)  
Старый 16.01.2018, 11:56
Профессор
Отправить личное сообщение для Dilettante_Pro Посмотреть профиль Найти все сообщения от Dilettante_Pro
 
Регистрация: 27.11.2015
Сообщений: 2,899

antonhauff,
Все-таки настоятельно рекомендую изменить функцию checkResult в соответствии с Пост№2
Ответить с цитированием
  #10 (permalink)  
Старый 16.01.2018, 12:13
Интересующийся
Отправить личное сообщение для antonhauff Посмотреть профиль Найти все сообщения от antonhauff
 
Регистрация: 16.10.2017
Сообщений: 23

Сообщение от Dilettante_Pro Посмотреть сообщение
antonhauff,
Все-таки настоятельно рекомендую изменить функцию checkResult в соответствии с Пост№2
Да, спасибо, изменил.
Еще поменял обработчик click на onclik, чтобы дальнейший код выполнялся только после того, как кнопка нбудет нажата и будет изменение в чате.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как работает это скрипт? SVARAI Общие вопросы Javascript 1 10.07.2014 01:13
Как вы относитесь к наркоманам? Maxmaxmaximus7 Оффтопик 7 05.02.2014 13:29
Открытие div блока при первом визите на сайт Nushaba Общие вопросы Javascript 28 20.12.2013 21:24
Скрипт не работает в любимом браузере. Как поменять? libinstyle Events/DOM/Window 7 01.07.2010 00:53
Как украсть скрипт? bayah Общие вопросы Javascript 6 26.04.2010 10:32