Запустить следующую функцию после выполнения 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();