Javascript.RU

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

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

Последний раз редактировалось Condorrr, 08.12.2017 в 13:55.
Ответить с цитированием
  #2 (permalink)  
Старый 08.12.2017, 12:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,707

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

function(test){
//тут что-то происходит или вызывается
setTimeout(test,Math.round(Math.random()*10000));
}
Ответить с цитированием
  #3 (permalink)  
Старый 08.12.2017, 12:55
Новичок на форуме
Отправить личное сообщение для Condorrr Посмотреть профиль Найти все сообщения от Condorrr
 
Регистрация: 08.12.2017
Сообщений: 6

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

Последний раз редактировалось Condorrr, 08.12.2017 в 13:47. Причина: не нарушаю правила форума.
Ответить с цитированием
  #4 (permalink)  
Старый 08.12.2017, 13:08
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,707

Тогда после завершения работы функции запустите её еще раз немедленно.
Ответить с цитированием
  #5 (permalink)  
Старый 08.12.2017, 13:14
Новичок на форуме
Отправить личное сообщение для Condorrr Посмотреть профиль Найти все сообщения от Condorrr
 
Регистрация: 08.12.2017
Сообщений: 6

собственно говоря я именно по этому поводу и прошу помощи. У меня не достаточно знаний, чтобы запустить данную функцию после её окончания. Если я просто напишу ниже кода
myFunction();
myFunction();...
и т.д. данная штука будет одновременно запускать кучу myFunction. Или я ошибаюсь и они будут идти одна за другой?
Ответить с цитированием
  #6 (permalink)  
Старый 08.12.2017, 13:26
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,707

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

Если функцию просто зациклить, то она просто заполнит стэк вызовов, что приведет к ошибке.
В приведенном вами коде вообще хрен пойми что, ясно только то, что функция result в ОВ функции myFunction вызвана не будет.
Ответить с цитированием
  #7 (permalink)  
Старый 08.12.2017, 13:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,064

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

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


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #8 (permalink)  
Старый 08.12.2017, 13:52
Новичок на форуме
Отправить личное сообщение для Condorrr Посмотреть профиль Найти все сообщения от Condorrr
 
Регистрация: 08.12.2017
Сообщений: 6

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

Последний раз редактировалось Condorrr, 08.12.2017 в 14:03. Причина: не умею правильно выражать свои мысли
Ответить с цитированием
  #9 (permalink)  
Старый 08.12.2017, 13:57
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,707

Condorrr, куда правильнее будет модифицировать код, что обрабатывает нажатие на button.
Если не вариант, то можно отслеживать изменение контента блока result.
Обычным timeout/interval результат будет неточным.
Ответить с цитированием
  #10 (permalink)  
Старый 08.12.2017, 14:22
Новичок на форуме
Отправить личное сообщение для Condorrr Посмотреть профиль Найти все сообщения от Condorrr
 
Регистрация: 08.12.2017
Сообщений: 6

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



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Динамическое подключение JS и вызов функции Paqwerty Events/DOM/Window 1 25.04.2017 16:33
После одного выполнения функции поставить лимит на повторный вызов nvkz-delete Events/DOM/Window 1 15.10.2016 17:48
Вызов функции страницы из расширения chrome nontxt Events/DOM/Window 0 09.02.2015 10:42
Вызов функции из скрытого iframe Beer75 Общие вопросы Javascript 2 05.06.2013 21:36
Вызов функции (Sandr) AJAX и COMET 12 16.03.2011 10:43