Почему не работает setTimeout()?

347
13 октября 2017, 18:27

Всем привет, решил немного декорировать код и написал такую замечательную (нерабочую) функцию

function interval(o){
        var i = 0,
            count = o.count || 1,
            timeout = o.timeout || 1000,
            start = o.startFunc || function(){},
            end = o.endFunc || function(){};
        var timer = setTimeout(function tick(){
            i++;
            if(i < count){
                start(i);
                setTimeout(tick, timeout);
            } else{
                clearTimeout(timer);
                end();
            }
        }, timeout);
    }

Вот попытка её запустить:

interval({
      count: 100,
      timeout: function(){return getRandomInt(5, 15)*10;},
      startFunc: function(count){
                $('#analyze').width(count+'%');
                $('#analyze-text > span').text(count+'%');
           },
      endFunc: function(){
                $('#computing').css('display', 'none');
                $('#finish-screen').fadeIn(600);
           }
      });

Проблема в том, что setTimeout() не срабатывает. Скажите, почему?

Answer 1

Разобрался. Дело в том, что мне действительно нужно передать функцию в переменную timeout, но при использовании функции setTimeout() вторым аргументом я передал лишь ссылку на функцию, в то время как ожидал, что она выполнится. Вот рабочий вариант.

function interval(o){
    var i = 0,
        count = o.count || 1,
        timeout = o.timeout || 1000,
        start = o.start || function(){},
        end = o.end || function(){};
        function tick(){
            i++;
            if(typeof(o.timeout) == 'function'){
                timeout = o.timeout();
            }
            if(i <= count){
                start(i);
                setTimeout(tick, timeout);
            } else{
                end();
            }
        }
        setTimeout(tick, timeout);
}
Answer 2

Обрати внимание на func tick

function interval(o) { 
    var i = 0; 
    var count = o.count || 1; 
    var timeout = o.timeout || 1000; 
    var start = o.startFunc || function() {}; 
    var end = o.endFunc || function() {}; 
    function tick() { 
        i++; 
        if (i < count) { 
            start(i); 
            setTimeout(tick, timeout); 
        } else { 
            clearTimeout(timer); 
            end(); 
        } 
    } 
    var timer = setTimeout(tick, timeout); 
} 
 
 
interval({ 
    count: 100, 
    timeout: function() { return getRandomInt(5, 15) * 10 }, 
    startFunc: function(count) { 
        console.log("startFunc"); 
    }, 
    endFunc: function() { 
        console.log("endFunc"); 
    } 
});

READ ALSO
Как отправить id элемента в объект?

Как отправить id элемента в объект?

Задача: Есть три шага в форме, после выбора одного из элементов выбранный шаг, а следующий появляетсяПо клику на элемент нужно отправить его...

289
Во скольких вкладках открыт сайт?

Во скольких вкладках открыт сайт?

Как проверить, во скольких вкладках открыт сайт? Чтобы можно было избежать высокой нагрузки на сервер, если например на сайте каждые пару...

289
Возвращает undefined и не может прочитать стиль

Возвращает undefined и не может прочитать стиль

Добрый День! Столкнулся с проблемой, JS никак не может понять стиль и выдает ошибку в consolelog каждый раз

253
Работа с input , вставка символа и пробелы

Работа с input , вставка символа и пробелы

Как сделать так чтобы, если в числе больше двух нулей, то оно отделялось пробелами то есть: 100 < 2 , 1 000 > 2, 1 000 000 > 2 и тд

218