Скрипт некорректно работает. Как можно исправить?
Есть юзерскрипт (некоторые переменные и шелуху, не очень информативную, я выбросил):
(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(). Подскажите пожалуйста, как можно поправить логику скрипта, чтобы не возникала такая ошибка? |
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); } При двух отдельных вызовах могут быть разные результаты, и логика проверки нарушается |
Слишком много выкинуто.
Откуда берётся last_read? Что выдаёт getread()? Очевидно, что last_read навсегда остаётся равным getread(), а почему это происходит, без представления откуда что берётся, не скажут и телепаты. |
Aetae,
Цитата:
Когда вызывается функция start? Что возвращает функция getread() при последующих вызовах? Цитата:
|
Цитата:
Конечно и last_read и возврат getread() как-то могут меняться(сомневаюсь), но так или иначе last_read остаётся равным getread(). :) |
Aetae,
Цитата:
- last_read задаётся равным getread() в функции start - функция checkResult крутится и ждет, когда изменится getread() Конечно, если в функции start вызов getread() сразу даст окончательный результат ... то ждать можно до бесконечности |
Вернул "шелуху" которая взаимодействует с сайтом:)
(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. Я так понимаю, тогда надо как-то отследить есть ли изменения после нажатия кнопки? Как это можно сделать? |
Немного не так. Если после нажатия кнопки (код я добавил, он находится в функции start()) в чате произошли изменения, то last_read не равен getread(). Но порой, кнопка нажимается долго (сайт подлагивает) и в таком случае ,дальнейший код выполняется быстрее чем появляюься изменения в чате и тогда last_read равен getread() и мы попадаем в третий блок.
|
antonhauff,
Все-таки настоятельно рекомендую изменить функцию checkResult в соответствии с Пост№2 |
Цитата:
Еще поменял обработчик click на onclik, чтобы дальнейший код выполнялся только после того, как кнопка нбудет нажата и будет изменение в чате. |
Часовой пояс GMT +3, время: 12:34. |