var xhr = new XMLHttpRequest(); xhr.open(method, url, false); xhr.send(data); return xhr.responseText; } Синхронный код var data = syncXHR('GET', ‘http://host1/page.json’); data = processData(data); syncXHR(‘POST’, ‘http://host2/result/’, data); syncXHR(‘POST’, ‘http://host3/result/’, data); alert(‘Done!’);
очередь событий • Ждет события • Выполняет события из очереди – События в очередь поступают во время выполнения событий – События генерируют события • Завершается когда очередь пуста
– Не выполнен (выполняется) – Выполнен (результат) – Отклонен (ошибка) • Меняет состояние только 1 раз – В событиях состояние меняется сколько угодно раз • Запоминает свое состояние – В отличии от события в котором состояние – это поток http://wiki.commonjs.org/wiki/Promises
Promise • Слушатель не может вмешаться – С чистыми промисами можно завершить промис на слушателе – Меньше логических ошибок http://api.jquery.com/category/deferred-object/
= processData(data); var promises = [ defferedXHR(‘POST’, ‘http://host2/result/’, data), defferedXHR(‘POST’, ‘http://host3/result/’, data) ]; when(promises, function (data) { alert(‘Done!’); }); }) .reject(‘Mua-ha-ha!’); // Это сделать нельзя
• Похожи на треды – Не могут прерываться где угодно процессором – Меньше расходов на «безопасные зоны» • Похожи на Event Loop – yield() и ручное прерывание фибера – Блокировка остальных фиберов – Нет реального параллелизма (не занимают все ядра процессора) • Параллельные запросы последовательно – Необходимо использовать дополнительные функции