Мастер-классы по Javascript, AJAX/COMET, jQuery Узнать больше...
Javascript.RU

Прячем асинхронность в 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/

Там ее можно скачать, а также почитать более подробные примеры и документацию.


Автор: Гость (не зарегистрирован), дата: 13 декабря, 2008 - 18:49
#permalink

нитуя не понял, надо было бы хоть рабочий код простой паузы привести


Автор: Гость (не зарегистрирован), дата: 3 февраля, 2009 - 14:55
#permalink

Че-то не совсем понял о чем речь в статье


Автор: Ntropy, дата: 8 октября, 2009 - 14:05
#permalink

Это перевод статьи подробности вы можете почитать по приведённой ссылке.


Автор: Александр Михалицын, дата: 28 октября, 2009 - 17:24
#permalink

Кто-нибудь пробовал разобраться как эта штука работает?
Мне лениво, хотя надо бы разобраться...


Автор: goldserg, дата: 26 апреля, 2010 - 10:55
#permalink

Чтобы самому написать асинхронный callback потребуется примерно раза в два меньше времени, чем на то чтобы разобраться как работает библиотека, и притом далеко еще не факт что она работает быстрее чем ваш собственный код
Хотя когда есть время всегда полезно разобраться в чужом коде и м.б. почерпнуть оттуда что-то новое.


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
10 + 5 =
Введите результат. Например, для 1+3, введите 4.
 
Новости

Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:

  • Ярославль (24-25 сентября)
  • Новосибирск (3-4 октября)
  • Казань (9-10 октября)
  • Минск (16-17 октября)
  • Днепропетровск (23-24 октября)
  • Одесса (30-31 октября)
  • Самара (13-14 ноября)

Более подробно - на странице мастер-классов.

Если вас интересует другой город - посмотрите здесь, выбрав "Другие города".

Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Последние обсуждения на форуме
Forum
Последние комментарии