Запустить следующую функцию после выполнения setTimeout

Как заставить его работать? PLS помощи.

function first() {
    setTimeout((function() {
        $('#q').append('first <br>');
    }), 1000);
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}
$.when(first()).done(second()).done(third()); 

first() работает как последняя функция, мне нужно сначала

Заклинание здесь: JSFIDDLE

Ответ 1

Я не уверен, почему вы это делаете, но если вы хотите выполнить их синхронно, вы можете поместить второй и третий вызов функции внутри setTimeout:

function first() {
    setTimeout(function() {
        $('#q').append('first <br>');
        second();
        third();
    }, 1000);
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}
first();

Ответ 2

Вам не нужно откладывать jquery, когда вы можете использовать javascript promises вместо этого.

function first() {
   return new Promise(function(resolve, reject) {
     setTimeout((function() {
        $('#q').append('first <br>');
        resolve("Stuff worked!");
    }), 1000);
});
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}
first().then(second).then(third); 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="q"></div>

Ответ 3

Попробуйте использовать $.Deferred() внутри first, верните $.Deferred() jQuery, если setTimeout завершено, вызовите second, third внутри .done()

function first() {
  var d = new $.Deferred();
  setTimeout((function() {
    $('#q').append('first <br>');
    d.resolve()
  }), 1000);
  return d.promise()
}

function second() {
  return $('#q').append('second <br>');

}

function third() {
  return $('#q').append('third <br>');
}

$.when(first()).done([second, third]);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js">
</script>
<div id='q'></div>

Ответ 4

Несколько проблем: ваша функция first (и остальные из них, если на то пошло) не возвращают promises, поэтому вы не можете использовать done. Если вы использовали promises, done запечатал обещание и не разрешил бы вам переадресовывать другой вызов done. Для этой настройки вам лучше было бы раскрыть свои вызовы функций, например:

function first() {
    setTimeout((function() {
        $('#q').append('first <br>');
        second();
    }), 1000);
}
function second() {
    $('#q').append('second <br>');
    third();
}
function third() {
    $('#q').append('third <br>');
}

Ответ 5

Если вы хотите изолировать функции, попробуйте это. Вы передаете callback в функцию first, и когда таймер отключается, этот обратный вызов вызывается. В этом обратном вызове вы можете вызвать second() и third().

function first(callback) {
    setTimeout(function() {
        $('#q').append('first <br>');
        callback();
    }, 1000);
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}
first(function(){
   second();
   third();
});

Ответ 6

Попробуйте это.

function first() {
    setTimeout((function() {
        $('#q').append('first <br>');
        second();
        third();
    }), 1000);
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}
first();

Ответ 7

попробовать:

function start() {
    setTimeout((function () {
        $.when(first()).done(second()).done(third());
    }), 1000);
}
function first() {
    $('#q').append('first <br>');
}
function second() {
    $('#q').append('second <br>');
}
function third() {
    $('#q').append('third <br>');
}

start();