Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Многократный вызов асинхронной функции с плавающим временем выполнения (https://javascript.ru/forum/events/71723-mnogokratnyjj-vyzov-asinkhronnojj-funkcii-s-plavayushhim-vremenem-vypolneniya.html)

Condorrr 08.12.2017 12:30

Многократный вызов асинхронной функции с плавающим временем выполнения
 
Собственно говоря, сама задача заложена в заголовке. Заранее извиняюсь, если данная или похожая тема поднималась на форуме, но я похожей не нашел. 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.

Nexus 08.12.2017 12:34

После завершения работы функции запустите по таймеру эту функцию еще раз.

function(test){
//тут что-то происходит или вызывается
setTimeout(test,Math.round(Math.random()*10000));
}

Condorrr 08.12.2017 12:55

На самом деле это немного неверно, ведь функция может завершиться через 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 может окончить данную функцию в любой момент и задача стоит именно после окончания функции вызвать её повторно.

Nexus 08.12.2017 13:08

Тогда после завершения работы функции запустите её еще раз немедленно. :-?

Condorrr 08.12.2017 13:14

:yes: собственно говоря я именно по этому поводу и прошу помощи. У меня не достаточно знаний, чтобы запустить данную функцию после её окончания. Если я просто напишу ниже кода
myFunction();
myFunction();...
и т.д. данная штука будет одновременно запускать кучу myFunction. Или я ошибаюсь и они будут идти одна за другой?:(

Nexus 08.12.2017 13:26

Condorrr, что вы хотите сделать?
Я уверен, что вы выбрали неправильный алгоритм реализации задумки.

Если функцию просто зациклить, то она просто заполнит стэк вызовов, что приведет к ошибке.
В приведенном вами коде вообще хрен пойми что, ясно только то, что функция result в ОВ функции myFunction вызвана не будет.

рони 08.12.2017 13:28

Condorrr,
Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

Condorrr 08.12.2017 13:52

Реализация однозначно неверна, но т.к. я только учусь, то я изначально выбрал очевидное решение, которое потом будет мной совершенствоваться до идеала. А задача очень проста. Есть кнопка button, которая отправляет на сервер запрос. В поле result возвращается ответ с рандомным значением. Ответ от сервера может приходить в промежутке от 1 до нескольких десятков тысяч милисекунд. Кнопка button может нажиматься бесконечно долго, пока не будет получен результат, предположим, "1945" При получении нужного значения в поле, в простейшую таблицу записывается complete1(2,3,..) с временем получения нужного результата. После занесения данных в таблицу, функция начинает работу заново.

Nexus 08.12.2017 13:57

Condorrr, куда правильнее будет модифицировать код, что обрабатывает нажатие на button.
Если не вариант, то можно отслеживать изменение контента блока result.
Обычным timeout/interval результат будет неточным.

Condorrr 08.12.2017 14:22

+ к карме однозначно. Отслеживание блока контента - это идеальное решение. Единственная задача - опрос самого блока, т.к. он при ожидании отклика равен undefined. Но это уже совсем другая история. После того как я начал озвучивать саму задачу, я сам осознал, что мне нужен банальный автокликер с отслеживанием результата. Простите, что морочил голову уважаемым форумчанам, тему можно временно оставить открытой, возможно еще какие-то идеи подскажут люди. Nexus ’у спасибо за терпение)


Часовой пояс GMT +3, время: 02:25.