Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Задержка в задержке (https://javascript.ru/forum/misc/50461-zaderzhka-v-zaderzhke.html)

igorz 27.09.2014 01:38

Задержка в задержке
 
Это как "нужно смотреть ещё глубже (с)" :haha:
Вообщем такая проблема - хочу сделать чтоб выполнялось что-то вроде такого:
function intv() {
    
    var i = 0;
    var j = 0;
    
    var interval_1 = setInterval(function(){
  		console.log("out = " + i);
        
        var interval_2 = setInterval(function(){
            console.log("in = " + j);
            j++;
            if (j == 2) {
                j = 0;
            	clearInterval(interval_2);
        	}
    	}, 5000);
        
        i++;
        if (i == 2) {
            clearInterval(interval_1);
        }
    }, 3000);
}

intv();

Т.е. чтоб цикл крутился с задержкой, и на каждой его итерации выполнялся внутренний цикл со своей задержкой. Но уже сколько пробую и с интервалом и с таймаутом, ну никак не могу добиться нужного результата :-/
В идеале бы получить:
Код:

out = 0
in = 0
in = 1
out = 1
in = 0
in = 1

А на деле выходит:
Код:

out = 0
out = 1
in = 0
in = 1
in = 0
in = 1

Совсем не та очерёдность :-/

igorz 27.09.2014 02:07

Цитата:

Сообщение от Rise (Сообщение 332446)
igorz, :blink: а где собственно цикл?

А чем Вам interval_1 и interval_2 не циклы, которые выполняются пока их не остановят ? В моём случае каждый по 2 раза до clearInterval.

igorz 27.09.2014 02:19

ps - Хотя, я наверное глупость написал через интервалы...
Извиняюсь за эту тему... и если можно, пусть модераторы удалят :)

igorz 27.09.2014 02:36

Да почему-то я всё думал что внешний интервал будет 100% ждать завершения внутреннего, а оно же не так...

kostyanet 27.09.2014 11:19

Будет ждать если внутренний отключит внешний. Вы мыслите геометрически, а тут надо мыслить хронометрически.

kostyanet 27.09.2014 11:23

Цитата:

Сообщение от igorz
Т.е. чтоб цикл крутился с задержкой

Так добавьте эту задержку. Дубовый способ в функции интервала проверять тики:

Цитата:

if(ticks++ < 100)
return;
ticks=0;
// тут что-то полезное делается
Или проверять время:

var start = new Date;

// в функции интервала

var now=new Date;
if(now-start<100)
 return;

igorz 27.09.2014 13:28

Всё равно не пойму до конца.
var abc_counter = 0;

function abc() {
    var abc_Timeout = setTimeout(function() {        
        console.log("setTimeout 1000");
        abc_counter++;
        if (abc_counter < 5) {
            abc(); 
        } else {
            clearTimeout(abc_Timeout); 
        }
    },1000);
}
abc();

Всё классно - пробегает 5 раз по 1 секунде. А как правильно внутрь каждого выполнения всунуть ещё одну функцию с задержкой, но так, чтоб пока она не выполнится то следующий виток внешней не начнётся ?
Вроде бы, логически переделываю в такое, но выходит что неправильно.(и да, с тиками не понял честно говоря как именно их использовать)

var abc_counter = 0;
var inner_abc_counter = 0;

function abc() {
    var abc_Timeout = setTimeout(function() {        
        console.log("setTimeout 1000");
        
        inner_abc();
        function inner_abc() {
            var inner_Timeout = setTimeout(function() {
            	console.log("setTimeout 500");
            	inner_abc_counter++;
            	if (inner_abc_counter < 3) {
            		inner_abc(); 
        		} else {
            		clearTimeout(inner_Timeout); 
        		}
            },500);
        }
        inner_abc_counter = 0;
        
        abc_counter++;
        if (abc_counter < 5) {
            abc(); 
        } else {
            clearTimeout(abc_Timeout); 
        }
    },1000);
}
abc();


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