- 2 функции которые надо выполнить поочередно, а именно так, чтобы работа второй не начиналась до того момента пока первая полностью не завершит своё выполнение
- эти функции не должны знать о друг друге (то есть никаких условий внутри вроде "следующим вызываем blabla2()", из blabla1() соответственно…)
- фактически мне нужен модифицируемый лист задач, в котором задачи не могут выполняться одновременно как им вздумается
Говоря об очередях и листе, я нарыл про массив вкупе с .push/.shift итд, наивно по неопытности полагая, что достаточно лишь вбить в массив список функций, а там оно отсортируется с временными промежутками само. Я набросал быдлокод и все мои изначальные подозрения таки сбылись — может всё и по порядку, но работают функции опять же одновременно:
<html>
<head>
<title>blah</title>
</head>
<body>
<a href="downloadFile.zip" id="download" class="button">Download the file...</a>
<a href="downloadFile.zip" id="download2" class="button">Download the file...</a>
<script language="javascript">
var downloadButton = document.getElementById("download");
var downloadButton2 = document.getElementById("download2");
var counter = 10;
var counter2 = 10;
var newElement = document.createElement("p");
var newElement2 = document.createElement("p");
newElement.innerHTML = "You can download the file in 10 seconds.";
newElement2.innerHTML = "You can download the file in 10 seconds.";
//var id;
downloadButton.parentNode.replaceChild(newElement, downloadButton);
downloadButton2.parentNode.replaceChild(newElement2, downloadButton2);
//имитация бурной деятельности
var zoxo = function zoxo() {
id = setInterval(
function() {
counter--;
if(counter < 0) {
newElement.parentNode.replaceChild(downloadButton, newElement);
clearInterval(id);
} else {
newElement.innerHTML = "You can download the file in " + counter.toString() + " seconds.";
}
}
, 1000);
}
//имитация бурной деятельности
var zoxo2 = function zoxo2() {
id2 = setInterval(
function() {
counter2--;
if(counter2 < 0) {
newElement2.parentNode.replaceChild(downloadButton2, newElement2);
clearInterval(id2);
} else {
newElement2.innerHTML = "You can download the file in " + counter2.toString() + " seconds.";
}
}
, 1000);
}
var funqueue = [];
funqueue.push(zoxo);
funqueue.push(zoxo2);
// Remove and execute all items in the array
/**/
while (funqueue.length > 0) {
(funqueue.shift())();
}
/**/
</script>
</body>
</html>
Чтобы понять меня лучше, можно глянуть на очереди в том же jQuery. Если создать продолжительную анимацию (медленную для наглядности) блока в одну сторону (к примеру по onclick, влево), а потом нажать на кнопку, функция которой наоборот тянет блок в другую сторону(вправо), то видно, что первая анимация не прервётся, а завершит свою работу до конца, но при этом и второй клик останется в памяти, который в последующем вызовет (поставит на очередь) вторую функцию, выполняющую анимацию блока вправо…