08.12.2017, 12:30
|
Новичок на форуме
|
|
Регистрация: 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.
|
|
08.12.2017, 12:34
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
После завершения работы функции запустите по таймеру эту функцию еще раз.
function(test){
//тут что-то происходит или вызывается
setTimeout(test,Math.round(Math.random()*10000));
}
|
|
08.12.2017, 12:55
|
Новичок на форуме
|
|
Регистрация: 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.
Причина: не нарушаю правила форума.
|
|
08.12.2017, 13:08
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Тогда после завершения работы функции запустите её еще раз немедленно.
|
|
08.12.2017, 13:14
|
Новичок на форуме
|
|
Регистрация: 08.12.2017
Сообщений: 6
|
|
собственно говоря я именно по этому поводу и прошу помощи. У меня не достаточно знаний, чтобы запустить данную функцию после её окончания. Если я просто напишу ниже кода
myFunction();
myFunction();...
и т.д. данная штука будет одновременно запускать кучу myFunction. Или я ошибаюсь и они будут идти одна за другой?
|
|
08.12.2017, 13:26
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Condorrr, что вы хотите сделать?
Я уверен, что вы выбрали неправильный алгоритм реализации задумки.
Если функцию просто зациклить, то она просто заполнит стэк вызовов, что приведет к ошибке.
В приведенном вами коде вообще хрен пойми что, ясно только то, что функция result в ОВ функции myFunction вызвана не будет.
|
|
08.12.2017, 13:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,112
|
|
Condorrr,
Пожалуйста, отформатируйте свой код!
Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]
О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
|
|
08.12.2017, 13:52
|
Новичок на форуме
|
|
Регистрация: 08.12.2017
Сообщений: 6
|
|
Реализация однозначно неверна, но т.к. я только учусь, то я изначально выбрал очевидное решение, которое потом будет мной совершенствоваться до идеала. А задача очень проста. Есть кнопка button, которая отправляет на сервер запрос. В поле result возвращается ответ с рандомным значением. Ответ от сервера может приходить в промежутке от 1 до нескольких десятков тысяч милисекунд. Кнопка button может нажиматься бесконечно долго, пока не будет получен результат, предположим, "1945" При получении нужного значения в поле, в простейшую таблицу записывается complete1(2,3,..) с временем получения нужного результата. После занесения данных в таблицу, функция начинает работу заново.
Последний раз редактировалось Condorrr, 08.12.2017 в 14:03.
Причина: не умею правильно выражать свои мысли
|
|
08.12.2017, 13:57
|
Профессор
|
|
Регистрация: 04.12.2012
Сообщений: 3,791
|
|
Condorrr, куда правильнее будет модифицировать код, что обрабатывает нажатие на button.
Если не вариант, то можно отслеживать изменение контента блока result.
Обычным timeout/interval результат будет неточным.
|
|
08.12.2017, 14:22
|
Новичок на форуме
|
|
Регистрация: 08.12.2017
Сообщений: 6
|
|
+ к карме однозначно. Отслеживание блока контента - это идеальное решение. Единственная задача - опрос самого блока, т.к. он при ожидании отклика равен undefined. Но это уже совсем другая история. После того как я начал озвучивать саму задачу, я сам осознал, что мне нужен банальный автокликер с отслеживанием результата. Простите, что морочил голову уважаемым форумчанам, тему можно временно оставить открытой, возможно еще какие-то идеи подскажут люди. Nexus ’у спасибо за терпение)
|
|
|
|