Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 18.03.2014, 10:10
Интересующийся
Отправить личное сообщение для Ilya_Nsk Посмотреть профиль Найти все сообщения от Ilya_Nsk
 
Регистрация: 07.02.2014
Сообщений: 11

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

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

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


О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting.
Ответить с цитированием
  #3 (permalink)  
Старый 18.03.2014, 13:55
Профессор
Отправить личное сообщение для BallsShaped Посмотреть профиль Найти все сообщения от BallsShaped
 
Регистрация: 14.09.2012
Сообщений: 162

Нужно, чтобы 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();
    }
  };
} ();
Ответить с цитированием
  #4 (permalink)  
Старый 18.03.2014, 14:45
Аватар для deivan
Профессор
Отправить личное сообщение для deivan Посмотреть профиль Найти все сообщения от deivan
 
Регистрация: 02.08.2012
Сообщений: 293

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


Длинный путь - начать полноценное изучение javascript.
Ответить с цитированием
  #5 (permalink)  
Старый 19.03.2014, 08:58
Интересующийся
Отправить личное сообщение для Ilya_Nsk Посмотреть профиль Найти все сообщения от Ilya_Nsk
 
Регистрация: 07.02.2014
Сообщений: 11

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

что, согласитесь, не комильфо..
Как заставить функцию дождаться выполнения самое себя?
Ответить с цитированием
  #6 (permalink)  
Старый 19.03.2014, 09:40
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,123

Сообщение от 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>

Дабы видеть "изменения" по ходу выполнения скрипта - тот скрипт должен разбиваться на потоки.
Каждое сообщение должно выводиться своим потоком. В противном случае ты увидишь только "итог"...
Ответить с цитированием
  #7 (permalink)  
Старый 19.03.2014, 20:13
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

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

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

mainFunc();

Цитата:
Дело в том, что setTimeout никогда не выполняет функцию сразу. Он лишь планирует ее выполнение. Но интерпретатор JavaScript начнёт выполнять запланированные функции лишь после выполнения текущего скрипта
Ответить с цитированием
  #8 (permalink)  
Старый 20.03.2014, 08:12
Интересующийся
Отправить личное сообщение для Ilya_Nsk Посмотреть профиль Найти все сообщения от Ilya_Nsk
 
Регистрация: 07.02.2014
Сообщений: 11

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

Последний раз редактировалось Ilya_Nsk, 20.03.2014 в 08:14.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки данных и параллельное выполнение функций Dorian_bs Общие вопросы Javascript 11 10.01.2014 18:58
Jquery, Последовательное выполнение функций разных div в одном скрипте. schnitzer Общие вопросы Javascript 3 29.09.2013 02:49
Много js функций получается Evgeny_Dedov jQuery 4 15.07.2013 15:17
Непонятный алгоритм отработки функций Jopses jQuery 5 16.02.2013 12:55
Как получить список пользовательских функций объекта window? Маэстро Events/DOM/Window 13 03.07.2010 13:20