Прячем асинхронность в Narrative JavaScript
Narrative JavaScript - расширение Javascript (прекомпилируемое в обычный Javascript), которое делает асинхронные вызовы блокирующимися. При помощи Narrative JavaScript можно реализовать функцию sleep() и описывать сложные асинхронные последовательности запросов обычным, линейным кодом без каллбэков.
Narrative JavaScript реализован через компилятор, который переводит специфичные "фишки" расширения в обычный, понимаемый браузерами JS-код.
В JavaScript - код не может блокироваться и ждать наступления события. Событие должно обрабатываться отдельным, асинхронным обработчиком. Иногда это удобно, но часто заставляет разбивать с виду простую последовательность действий на множество по сути ненужных функций.
Narrative JavaScript добавляет "yielding operator" для функций, который блокирует выполнение до наступления события. Функция приостанавливается, пока не наступит событие, а затем продолжает выполнение в точке, где произошла остановка.
Это позволяет вместо сложной последовательности асинхронных обработчиков - писать простой, линейный, читабельный код.
Библиотека появилась как результат долгой работы по написанию и отладке сложных AJAX-приложений.
Narrative JavaScript состоит из компилятора и runtime библиотеки. Вы пишете код как линейный Narrative JavaScript, используя yielding operator, и компилятор распарсивает и переводит этот код в обычный (асинхронный) JavaScript. Затем Вы размещаете откомпилированный код на сервере вместе с runtime-библиотекой.
Эта функция sleep приостанавливает выполнение на millis секунд БЕЗ поедания CPU и блокирования остальных процессов.
function sleep(millis) {
var notifier = new EventNotifier();
setTimeout(notifier, millis);
notifier.wait->();
}
С ее помощью можно реализовать анимацию с паузами между кадрами:
function animate(element, property, endValue, duration, frequency) {
// calculate animation variables
var frameCount = Math.ceil(duration/frequency);
var startValue = parseInt(element.style[property], 10);
var distance = endValue - startValue;
var jumpSize = Math.ceil(distance/frameCount);
// do the animation
for (var i = 0; i < frameCount - 1; i++) {
var nextValue = startValue + (jumpSize * i);
element.style[property] = nextValue + "px";
// note the yielding operation
sleep->(frequency);
}
element.style[property] = endValue + "px";
}
Если Вас заинтересовало это краткое описание - сайт библиотеки находится на http://www.neilmix.com/narrativejs/doc/
Там ее можно скачать, а также почитать более подробные примеры и документацию.
|
нитуя не понял, надо было бы хоть рабочий код простой паузы привести
Че-то не совсем понял о чем речь в статье
Это перевод статьи подробности вы можете почитать по приведённой ссылке.
Кто-нибудь пробовал разобраться как эта штука работает?
Мне лениво, хотя надо бы разобраться...
Чтобы самому написать асинхронный callback потребуется примерно раза в два меньше времени, чем на то чтобы разобраться как работает библиотека, и притом далеко еще не факт что она работает быстрее чем ваш собственный код
Хотя когда есть время всегда полезно разобраться в чужом коде и м.б. почерпнуть оттуда что-то новое.
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.