Многократный вызов асинхронной функции с плавающим временем выполнения
Собственно говоря, сама задача заложена в заголовке. Заранее извиняюсь, если данная или похожая тема поднималась на форуме, но я похожей не нашел. SetInterval/setTimeout не подходят из-за рандомного времени выполнения асинхронной функции. Ну и для наглядности простой пример (возможно с ошибками, пример просто для наглядности):
//любое рандомное значение в милисекундах function randomInteger(min, max) { var rand = min + Math.random() * (max + 1 - min); rand = Math.floor(rand); return rand; } function(test){ //тут что-то происходит или вызывается } setTimeout(test, ( randomInteger(5, 10000) ) ); //а вот тут требуется повторно (или циклически) продолжать вызывать функцию test. |
После завершения работы функции запустите по таймеру эту функцию еще раз.
function(test){ //тут что-то происходит или вызывается setTimeout(test,Math.round(Math.random()*10000)); } |
На самом деле это немного неверно, ведь функция может завершиться через 5мс, а повторный вызов функции произойдет через максимальный интервал. Хотелось побыстрее привести пример, но из-за неверного вопроса, наверное, добавлю кусочек кода:
function myFunction(){ function result(){ var test = Number(document.getElementById("test").innerHTML); if(test > 0){ return; } else { document.getElementsByClassName("button")[0].click(); function result(){ var test = Number(document.getElementById("test").innerHTML); if(test > 0){ return; } else { document.getElementsByClassName("button")[0].click(); function result(){ var test = Number(document.getElementById("test").innerHTML); if(test > 0){ return; } else { document.getElementsByClassName("button")[0].click(); function result(){ var test = Number(document.getElementById("test").innerHTML); if(test > 0){ return; } else { /*тут может продолжаться бесконечно долго, пока не будет получено if(test > 0) */} } setTimeout(result, 5000); } } setTimeout(result, 5000); } } setTimeout(result, 5000); } } } myFunction(); Такая конструкция может длиться от 5000мсек до очень долго. return может окончить данную функцию в любой момент и задача стоит именно после окончания функции вызвать её повторно. |
Тогда после завершения работы функции запустите её еще раз немедленно. :-?
|
:yes: собственно говоря я именно по этому поводу и прошу помощи. У меня не достаточно знаний, чтобы запустить данную функцию после её окончания. Если я просто напишу ниже кода
myFunction(); myFunction();... и т.д. данная штука будет одновременно запускать кучу myFunction. Или я ошибаюсь и они будут идти одна за другой?:( |
Condorrr, что вы хотите сделать?
Я уверен, что вы выбрали неправильный алгоритм реализации задумки. Если функцию просто зациклить, то она просто заполнит стэк вызовов, что приведет к ошибке. В приведенном вами коде вообще хрен пойми что, ясно только то, что функция result в ОВ функции myFunction вызвана не будет. |
Condorrr,
Пожалуйста, отформатируйте свой код! Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Реализация однозначно неверна, но т.к. я только учусь, то я изначально выбрал очевидное решение, которое потом будет мной совершенствоваться до идеала. А задача очень проста. Есть кнопка button, которая отправляет на сервер запрос. В поле result возвращается ответ с рандомным значением. Ответ от сервера может приходить в промежутке от 1 до нескольких десятков тысяч милисекунд. Кнопка button может нажиматься бесконечно долго, пока не будет получен результат, предположим, "1945" При получении нужного значения в поле, в простейшую таблицу записывается complete1(2,3,..) с временем получения нужного результата. После занесения данных в таблицу, функция начинает работу заново.
|
Condorrr, куда правильнее будет модифицировать код, что обрабатывает нажатие на button.
Если не вариант, то можно отслеживать изменение контента блока result. Обычным timeout/interval результат будет неточным. |
+ к карме однозначно. Отслеживание блока контента - это идеальное решение. Единственная задача - опрос самого блока, т.к. он при ожидании отклика равен undefined. Но это уже совсем другая история. После того как я начал озвучивать саму задачу, я сам осознал, что мне нужен банальный автокликер с отслеживанием результата. Простите, что морочил голову уважаемым форумчанам, тему можно временно оставить открытой, возможно еще какие-то идеи подскажут люди. Nexus ’у спасибо за терпение)
|
Часовой пояс GMT +3, время: 02:25. |