2017-01-18 12 views
-1

Я хочу создать сценарий GreaseMonkey. Я хочу иметь setTimeout в конце моего времени, но я не знаю, как это сделать.Javascript while setTimeout

run(); 
function run(){ 
    var klovas = document.getElementById("light").innerHTML; 
    var btn = document.getElementsByClassName("farm_icon farm_icon_a"); 
    if(klovas < 6){ 
    alert("Kevés egység van"); 
    } else { 
    var i = 0; 
    while (i < btn.length){ 
     if(typeof btn[i] != "undefined"){ 
     btn[i].click(); 
     } 
    i++; 
    setTimeout("run()", 3000); 
    } 
    } 
} 

С помощью этого кода, проблема заключается в том, что setTimeout не работает и не ждать 3 секунды, как предполагается.

Я пробовал другие способы, но ничего не сработало.

EDIT

function run(){ 
    var klovas = document.getElementById("light").innerHTML; 
    var btn = document.getElementsByClassName("farm_icon farm_icon_a"); 
    if(klovas < 2){ 
    alert("Kevés egység van"); 
    } else { 
    var i = 0; 
    while (i < btn.length){ 
     if(typeof btn[i] != "undefined"){ 
     btn[i].click(); 
     } 
    i++;  
    } 
    } 
} 
setInterval(run, 6000); 

I судимое это. Его запуск каждые 6 секунд, но я получаю ошибку на веб-сайте, что я хочу, чтобы кликнуть более 5 раз в секунду. Итак, подождите 6 секунд, когда я открываю страницу, и после нажатия, и я получаю ошибку. Это не реактивная работа. :(

ответ

0

Если вы хотите, чтобы это только один раз вызвать:

function run(){ 
 
    var data = [1,2,3]; 
 
    var i = 0; 
 
    while (i < data.length) { 
 
     console.log(data[i]); 
 
     i++; 
 
    } 
 
} 
 

 
setTimeout(run, 3000);

как вы написали это сейчас, это будет повторяться каждые 3 секунды.

function run(){ 
 
    var data = [1,2,3]; 
 
    var i = 0; 
 
    while (i < data.length) { 
 
     console.log(data[i]); 
 
     i++; 
 
    } 
 
    setTimeout(run, 3000); 
 
} 
 

 
run();

Но setInterval бы достичь тех же результатов.

function run(){ 
 
    var data = [1,2,3]; 
 
    var i = 0; 
 
    while (i < data.length) { 
 
     console.log(data[i]); 
 
     i++; 
 
    } 
 
} 
 

 
setInterval(run, 3000);

EDIT

Пользователь хотел посмотреть, что произойдет, если вы звоните setInterval внутри функции обратного вызова. Обратите внимание, что количество интервалов растет экспоненциально каждые 3 секунды.

setInterval вызывает функцию для запуска каждые 3 секунды, в то время как SetTimeout вызывает функцию для запуска раз в течение 3 секунд.

var numberOfIntervals = 0; 
 

 
function run(){ 
 
    setInterval(run, 3000); 
 
    numberOfIntervals++; 
 
    console.log(numberOfIntervals); 
 
} 
 

 
run();

0

Есть несколько проблем здесь.

Во-первых, в то время как SetTimeout может принимать функцию в качестве первого аргумента, вы хотели бы передать функцию в качестве аргумента, а не выполнять функцию, так что вы должны заменить . "run()" с run

во-вторых, я не совсем уверен, почему вы рекурсии - почему setTimeout внутри run() Вместо того, чтобы положить его внутри функции запуска, попробуйте положить его на дно, и удаление run() вызов? наверху. Насколько я могу судить, нет причин, по которым этот код должен возвращаться на alll.

+0

@Xufox Моя ошибка! Я отредактирую это прямо сейчас. – furkle

+0

Мне нужен перерыв после i ++. Теперь я попытался предупредить btn [i], и когда я встаю на экран, и я нажимаю ok, а затем работаю хорошо. просто я всегда должен нажимать ok. : D функция run() { var klovas = document.getElementById ("свет"). InnerHTML; var btn = document.getElementsByClassName ("farm_icon farm_icon_a"); if (klovas <2) { предупреждение («Недостаточно света»); } else { var i = 1; while (i