Последовательное исполнение функций
Уважаемые знатоки JavaScript,
я немало писАл на линейных языках, а тут впал в ступор. Поправьте, пожалуйста, маленький примерчик (http://learn.javascript.ru/play/MGxEJ) так, что бы сообщения из my_function показывались по очереди, а не одновременно, как сейчас.. Как получилось, что функция пользователя стала асинхронной? Читая Флэнагана, а не заметил, что "все создаваемые пользователем функции будут вызываться асинхронно". Про коллбэки я читал и там - в show_message - он, как бы, применен, но хотелось бы написать функцию, возвращающую управление в основной поток, когда этого хочет разработчик функции, а не разработчик языка. P.S. замечал здесь кнопочки "посмотреть", как такую "прикручивают" к ответу? |
Цитата:
Для этого его можно заключить в специальные теги: js/css/html и т.п., например: [js] ... ваш код... [/js] О том, как вставить в сообщение исполняемый javascript и html-код, а также о дополнительных возможностях форматирования - читайте http://javascript.ru/formatting. |
Нужно, чтобы 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(); } }; } (); |
ТС, у вас возникла трудность, поскольку вы сразу кинулись в жквери, с помощью которого написана эта вот функция show_message.
В ней используется ф-ция animate(), которая в контексте вашего примера запускает два сообщения параллельно. Короткий путь для достижения вашей задачи - использовать костыль: function my_function(){ show_message('<br>Это сообщение 1 _<br>'); setTimeout(function(){ show_message('<br>_ Это сообщение 2<br>'); }, 5000); // второе сообщение появится через 5 секунд. } Длинный путь - начать полноценное изучение javascript. |
Прошу простить, однако my_function из примера нужна, конечно, не для отображения сообщений! В ней последовательно исполняются некие действия и они опущены. Результат каждого действия должен быть "озвучен" системой. Действия исполняются иногда быстро и сообщения наслаиваются. И где видно, что функции show_message запускаются параллельно? Попытка внедрения callback функции приводит к нагромождению
show_message(mes, function(){show_message(work_function(),function(){show_message(other_my_fuction(),... ... ... ... ... )}) что, согласитесь, не комильфо.. Как заставить функцию дождаться выполнения самое себя? |
Цитата:
<!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> Дабы видеть "изменения" по ходу выполнения скрипта - тот скрипт должен разбиваться на потоки. Каждое сообщение должно выводиться своим потоком. В противном случае ты увидишь только "итог"... |
Нужно выполнить какую-то функцию только после той функции, в которой она вызывается, а не непосредственно во время вызова, я правильно понял? Ну так это легко:
function myFunc() { alert("Второй алерт"); } function mainFunc() { setTimeout(function(){myFunc()}, 0); alert("Первый алерт"); } mainFunc(); Цитата:
|
В общем, никуда не деться от любви.. Пришлось писАть свою show_message c callback'ом и громоздить..
Есть на просторах инета решения и с .differed и с .queue, но от громоздкости и слабочитаемости они не избавляли Спасибо всем участвовавшим |
Часовой пояс GMT +3, время: 09:46. |