Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Циклический вызов с задержкой. (https://javascript.ru/forum/css-html/35150-ciklicheskijj-vyzov-s-zaderzhkojj.html)

ToDayGoodDay 31.01.2013 22:39

Циклический вызов с задержкой.
 
Скрипт для Grease Monkey.


var url_cur = location.href ;
var name_pos = 0;
var cur_name = '';
		
var list_name = [ "test1" , "test2" ];


for(var j=0;j<list_name.length;j++){
	alert('!');
	temp(j);
}

function temp(j){
		var timeout_id = setTimeout(function(){
			alert(j);

			cur_name = list_name[j];
			alert(cur_name);
			if(check()){
				send_do(cur_name);
			}
			else{
				enter();
				send_do(cur_name);
			};
		},10000);

}


Цель:

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

Deff 31.01.2013 22:49

<script>
var url_cur = location.href ;
var name_pos = 0;
var cur_name = '';
		
var list_name = [ "test1" , "test2" ];


for(var j=0;j<list_name.length;j++){
	alert('j(цикла)='+j);
	temp(j);
}

function temp(j){
		var timeout_id = setTimeout(function(){

			cur_name = list_name[j];
			alert('j(с задержкой)='+j+'; cur_name='+cur_name);
			if(check()){
				send_do(cur_name);
			}
			else{
				enter();
				send_do(cur_name);
			};
		},1000);

}
</script>

Цитата:

Сообщение от ToDayGoodDay
Ничего не получается.

Это может бвть в случае наличия функций:check(); send_do() и enter() и их кривой работе

ToDayGoodDay 01.02.2013 05:56

Эти функции к ошибке не имеют отношение. Т.к.
1. При их изъятии также происходит зацикливание на 0-ом элементе.
2. Они стабильно работают уже более года.
3. Также нет задержки между сообщениями. Все выводятся сразу.

ToDayGoodDay 01.02.2013 07:41

alert(list_name.length);
if (name_pos < list_name.length) 
{
	alert(name_pos);
	temp(name_pos);
	
	name_pos++;
}

function temp(name_pos){
		var timer = setTimeout(function(){
			alert(name_pos);
			
			cur_name = list_name[name_pos];
			alert(cur_name);
			
		},10000);
}


Так тоже зависает на нулевом. Возможно не учел какие-то особенности GreaseMonkey ?

danik.js 01.02.2013 08:12

А почему между ними должна возникнуть задержка?
Вы в цикле запускаете несколько таймеров. Через 10 секунд все таймеры истекают и выполняются все заданные функции, практически одновременно.
Либо увеличивайте каждый раз время таймаута (что не есть гуд), либо запускайте таймеры по цепочке. Тоесть каждый раз выполняется функция, отрабатывает и запускает следующий таймер. Хз че вы получить хотите, еслиб подробней объяснили - было бы проще.

ToDayGoodDay 01.02.2013 08:14

Грубо говоря мне нужно отправить 10 сообщений. Отправил первое. Задержка 10 сек, отправил второе. Задержка 10 секунж. Отправил третие.

Примерно так:

var name_pos = 0;

if (name_pos < 100) 
{
	alert(name_pos);
		
		var timer = setTimeout(function(){
			alert(name_pos);
			
		name_pos++;	
		},10000);

}


Т.е. по идее он должен выводить 1,2,3,4.. с задержкой в 10 секундн. Он он выводит только 0 и каждую секунду.

Цитата:

либо запускайте таймеры по цепочке. Тоесть каждый раз выполняется функция, отрабатывает и запускает следующий таймер.
именно это мне и нужно реализовать

danik.js 01.02.2013 08:33

<script>
var messages = ['Доброе утро',  'Добрый день',  'Добрый вечер'];

function queueMessages ( messages ) {
    var index = 0;
    function queueMessage () {
        setTimeout(function () {
            sendMessage( messages[ index ++ ] );
            if ( messages[ index ] !== undefined ) {
                queueMessage();
            }
        }, 3000);
    }
    queueMessage();
}


function sendMessage ( message ) {
    document.body.appendChild( document.createTextNode( message + '! ' ) );
}


queueMessages( messages );
</script>

ToDayGoodDay 01.02.2013 10:36

Ошибка оказалась связана с работой самого плагина. Точнее не полнного понимания принципа его работы. При обновлении страницы, которое у меня происходит, он запускается понову. т.о. и происходит зацикливание на 0-ом элементе. Как от подобного можно избавиться?
В итоге получилось что мои предыдущ. варианты все-таки оказались правильными. Так же как и правильными все функции, однако из-за особенности работы плагина все работает не так как нужно.

Serg_pnz 01.02.2013 10:53

А если флаги в куки пихнуть?
Так же возможно стоит поставить какое-то ограничение на выполняемость, т.е. уйти от срабатывания на скрипты, выполняемые в фоновом режиме
// @include        *site.ru/forest_php.php*

В моём случае ГМ реагирует только на выполнение forest_php.php, который запускается в фоне.


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