Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Последовательное исполнение функций (https://javascript.ru/forum/dom-window/45836-posledovatelnoe-ispolnenie-funkcijj.html)

Ilya_Nsk 18.03.2014 10:10

Последовательное исполнение функций
 
Уважаемые знатоки JavaScript,
я немало писАл на линейных языках, а тут впал в ступор.
Поправьте, пожалуйста, маленький примерчик (http://learn.javascript.ru/play/MGxEJ) так, что бы сообщения из my_function показывались по очереди, а не одновременно, как сейчас.. Как получилось, что функция пользователя стала асинхронной? Читая Флэнагана, а не заметил, что "все создаваемые пользователем функции будут вызываться асинхронно".
Про коллбэки я читал и там - в show_message - он, как бы, применен, но хотелось бы написать функцию, возвращающую управление в основной поток, когда этого хочет разработчик функции, а не разработчик языка.
P.S. замечал здесь кнопочки "посмотреть", как такую "прикручивают" к ответу?

рони 18.03.2014 13:16

Цитата:

Сообщение от Ilya_Nsk
замечал здесь кнопочки "посмотреть", как такую "прикручивают" к ответу?

Пожалуйста, отформатируйте свой код!

Для этого его можно заключить в специальные теги: js/css/html и т.п., например:
[js]
... ваш код...
[/js]


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.

BallsShaped 18.03.2014 13:55

Нужно, чтобы show_message собирала сообщения в стек, и по оканчанию каждой анимации запускала следующую. Тип того:
var show_message = function () {
  var stack = [];
  var inProgress = false;
  
  function animate() {
    var currentMessage = stack.shift();
    
    /*
    тут запускаешь свои анимации и
    в коллбэке по завершению, запускаешь
    следующую:
    if (stack.length) animate();
    else inProgress = false;
    */
  }
  
  return function (message) {
    stack.push(message);
    
    if (!inProgress) {
      inProgress = true;
      animate();
    }
  };
} ();

deivan 18.03.2014 14:45

ТС, у вас возникла трудность, поскольку вы сразу кинулись в жквери, с помощью которого написана эта вот функция show_message.
В ней используется ф-ция animate(), которая в контексте вашего примера запускает два сообщения параллельно.
Короткий путь для достижения вашей задачи - использовать костыль:
function  my_function(){
      show_message('<br>Это сообщение 1      _<br>');        
      setTimeout(function(){
          show_message('<br>_       Это сообщение 2<br>');
      }, 5000); // второе сообщение появится через 5 секунд.
 }


Длинный путь - начать полноценное изучение javascript.

Ilya_Nsk 19.03.2014 08:58

Прошу простить, однако my_function из примера нужна, конечно, не для отображения сообщений! В ней последовательно исполняются некие действия и они опущены. Результат каждого действия должен быть "озвучен" системой. Действия исполняются иногда быстро и сообщения наслаиваются. И где видно, что функции show_message запускаются параллельно? Попытка внедрения callback функции приводит к нагромождению
show_message(mes, function(){show_message(work_function(),function(){show_message(other_my_fuction(),... ... ... ... ... )})

что, согласитесь, не комильфо..
Как заставить функцию дождаться выполнения самое себя?

ksa 19.03.2014 09:40

Цитата:

Сообщение от Ilya_Nsk
Поправьте, пожалуйста, маленький примерчик (http://learn.javascript.ru/play/MGxEJ) так, что бы сообщения из my_function показывались по очереди

Как вариант...

<!DOCTYPE html>
<html>
<head>
<!--
<script src='http://code.jquery.com/jquery-latest.js'></script>
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
function  my_function(){
	show_message('<br>Это сообщение 1      _<br>');        
	// bla-bla немного кода
	setTimeout(function (){
		show_message('<br>_       Это сообщение 2<br>');
	},2000);
};
function  show_message(Txt){
	var o=document.getElementById('txt');
	o.innerHTML=o.innerHTML+Txt;
}  
</script>
</head>
<body>
<input type="button" onclick="my_function()" value="Показать сообщение1 затем сообщение2" />
<p id='txt'></p>
</body>
</html>

Дабы видеть "изменения" по ходу выполнения скрипта - тот скрипт должен разбиваться на потоки.
Каждое сообщение должно выводиться своим потоком. В противном случае ты увидишь только "итог"...

Erolast 19.03.2014 20:13

Нужно выполнить какую-то функцию только после той функции, в которой она вызывается, а не непосредственно во время вызова, я правильно понял? Ну так это легко:
function myFunc()
{
   alert("Второй алерт");
}

function mainFunc()
{
  setTimeout(function(){myFunc()}, 0);
  alert("Первый алерт");
}

mainFunc();

Цитата:

Дело в том, что setTimeout никогда не выполняет функцию сразу. Он лишь планирует ее выполнение. Но интерпретатор JavaScript начнёт выполнять запланированные функции лишь после выполнения текущего скрипта

Ilya_Nsk 20.03.2014 08:12

В общем, никуда не деться от любви.. Пришлось писАть свою show_message c callback'ом и громоздить..
Есть на просторах инета решения и с .differed и с .queue, но от громоздкости и слабочитаемости они не избавляли
Спасибо всем участвовавшим


Часовой пояс GMT +3, время: 13:22.