JS Таймаут с зависимостью

Рейтинг: 0Ответов: 1Опубликовано: 27.09.2014

Здравствуйте.
Надеюсь, что вопрос сформулировал относительно правильно:

как я могу себе реализовать выполнение 2-х таймаутов (ну или как-то по-другому не через таймауты), чтобы был 1 внешний и 1 внутренний таймаут? Но главное как-то привязать внешний к тому, чтоб он не переходил к следующему шагу до тех пор, пока внутренний не выполнится.

Пробовал делать примерное так, но как-то неправильно выходит:

var abc_counter = 0;
var inner_abc_counter = 0;

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

Т.е. надо, чтобы выполнение прошло в строгом порядке:
setTimeout 500
setTimeout 2000
setTimeout 2000
setTimeout 500
setTimeout 2000
setTimeout 2000

А в моём случае выходит как:
setTimeout 500
setTimeout 500
setTimeout 2000
setTimeout 2000

Ответы

▲ 1

Не знаю, возможно, я не так понял, но логика при выполнении меньшего таймаута внутри большего немного нарушена. Если установить их последовательно, то вроде выполняется

var abs_counter = 0;
var abs_Interval = setInterval(function() {
    if (abs_counter < 2) {
        var inner_counter = 0;
        var first_Timeout = setTimeout(function() {
            console.log("setTimeout 500");
        }, 500);
        var second_Interval = setInterval(function() {
            if (inner_counter<2) {
                console.log("setTimeout 2000 + " + abc_counter);
                inner_counter++;
            } else {
                clearInterval(second_Interval);
            }
        }, 2000);
        abs_counter++;
    }
}, 4500);