Поочередное срабатывание setTimeout в JavaScript [дубликат]

69
08 апреля 2022, 21:30
На этот вопрос уже даны ответы здесь:
Последовательное выполнение SetTimeout() (4 ответа)
Закрыт 2 года назад.

У меня есть следующий код:

$(document).ready(function(){ 
    var status = $('#loading-banner h1'); 
    if(!status) return false; 
    setTimeout(function(){ 
        status.html('Авторизация в системе...'); 
    }, 5000); 
    setTimeout(function(){ 
        status.html('Получение информации...'); 
    }, 5000); 
    setTimeout(function(){ 
        $('#loading-banner').fadeOut(1000); 
    }, 5000); 
});

Если его выполнить, спустя 5 секунд сработает fadeOut(), соответственно функции, передаваемые setTimeout, срабатывают асинхронно. Если ли способ сделать так, чтобы эти функции выполнялись последовательно (то есть fadeOut() должна сработать спустя 15 секунд с момента загрузки документа) без использования множества вложенных функций, дабы не засорять стек? Так же не рассматриваю вариант поставить во втором таймауте 10000, а в третьем 15000, так как считаю это какими-то "костылями".

Answer 1

Пример используя promise:

    $(document).ready(function(){ 
        var status = $('#loading-banner h1'); 
        if(!status) return false; 
        function f1() { 
            return new Promise(function(resolve){ 
                setTimeout(function() { 
                    status.html('Авторизация в системе...'); 
                    resolve(); 
                }, 5000); 
            }); 
        } 
        function f2() { 
            return new Promise(function(resolve){ 
                setTimeout(function() { 
                    status.html('Получение информации...'); 
                    resolve(); 
                }, 5000); 
            }); 
        } 
        function f3() { 
            return new Promise(function(resolve){ 
                setTimeout(function() { 
                    $('#loading-banner').fadeOut(1000); 
                    resolve(); 
                }, 5000); 
            }); 
        } 
        f1().then(function() { 
            return f2(); 
        }).then(function() { 
            return f3(); 
        }); 
    });
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> 
<div id="loading-banner"> 
    <h1>Статус ок</h1> 
</div>

READ ALSO
Как обернуть каждое изображение в отдельный блок?

Как обернуть каждое изображение в отдельный блок?

Возникла проблема так как я не верно что то делаюЯ хочу обернуть каждое изображение в div с любым именем class

119
Отправка по нажатию

Отправка по нажатию

У меня есть часть кода которая при закрытии окна сразу выполняет код

238
Vue JS &amp; Google maps. Директивы рендерятся как HTML теги

Vue JS & Google maps. Директивы рендерятся как HTML теги

Использую библиотеку 2vue-google-maps для VueВ infoWindow есть кнопка с @click, проблема в том что она рендерится как обычный HTML тег и собственно не работает

215
Нужно ли вызывать Dispose для контекста Entity Framework?

Нужно ли вызывать Dispose для контекста Entity Framework?

Делаю проект просто с целью обучения, там создал класс CommentService, в котором содержатся методы для работы с БД (с целью сократить код в будущем):

258