Объекты Deferred

В настоящее время JavaScript не предусматривает поддержку концепции потоков выполнения, но существует возможность асинхронного выполнения запросов XMLHttpRequest с задержкой – с помощью функции setTimeout. Однако, чтобы запутаться в таком программном коде, потребуется оформить совсем немного асинхронных вызовов. Библиотека Base предоставляет класс с именем Deferred, который поможет справиться со сложными ситуациями, часто связанными с рутинными операциями реализации асинхронных событий. Подобно другим абстракциям, объекты Deferred позволяют прятать подробности реализации и/или шаблонный программный код за аккуратным и непротиворечивым интерфейсом.

Если попытаться описать ценность Deferred в одном предложении, оно могло бы звучать примерно так: эти объекты позволяют обрабатывать все операции сетевого вводавывода одинаковым способом независимо от того, являются ли они синхронными или асинхронными. Даже если объект Deferred уже запущен, потерпел неудачу или операция завершилась успехом, процедура составления цепочек функций обратного вызова и функций обработки ошибок остается неизменной. Как можно догадаться, такое поведение существенно упрощает работу.

Из ключевых особенностей объектов Deferred можно упомянуть возможность составлять цепочки из множества функций обратного вызова и функций обработки ошибок так, что они будут вызываться в заранее заданном порядке, а также возможность передавать объекту Deferred процедуру отмены, с помощью которой можно безопасно прерывать выполнение асинхронных запросов.


Возможно, вы еще не заметили, но все функции XHR, представленные ранее в этой главе, возвращают объект Deferred, просто раньше у нас не было необходимости занимать ся его изучением. В действительности все сетевые операции вводавы вода в инструментальном наборе используют и возвращают объекты Deferred, потому что эти объекты обеспечивают высокую гибкость управления асинхронными операциями, которые являются результа том выполнения сетевых запросов.

Прежде чем вернуться к какимто из предыдущих попыток использования XHR, взгляните на следующий абстрактный пример, демонстрирующий применение объекта Deferred и составляющий основу некоторых концепций, которые нам предстоит рассматривать:
//Создать объект Deferred
var d = new dojo.Deferred(/* Здесь можно указать функцию отмены */);
//Добавить функцию обратного вызова
d.addCallback(function(response) {
console.log("The answer is", response);
return response;
});
//Добавить еще одну функцию обратного вызова,
//которая будет запускаться после предыдущей
d.addCallback(function(response) {
console.log("Yes, indeed. The answer is", response);
return response;
});
//Добавить функцию обработки ошибок на тот случай, если чтото пойдет не так
d.addErrback(function(response) {
console.log("An error occurred", response);
return response;
});
//Можно добавить еще столько функций обратного вызова
//и обработки ошибок, сколько потребуется
/* Некоторый программный код, выполняющий вычисления */
//Где-то в другом месте запускается цепочка функций обратного вызова
d.callback(46);
Если запустить этот пример в Firebug, можно увидеть следующий вы
вод:
The answer is 46
Yes, indeed.


The answer is 46

Прежде чем перейти к более интересным примерам, наверное, имеет смысл ознакомиться с прикладным интерфейсом объекта Deferred.
Объект Deferred может переходить в состояние ошибки в любом из следующих трех случаев:
• Функция обратного вызова или функция обработки ошибок получила аргумент, который является объектом Error.
• Функция обратного вызова или функция обработки ошибок возбудила исключение.
• Функция обратного вызова или функция обработки ошибок вернула значение, которое является объектом Error.

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
DeferredList
JSON
OpenAjax Hub
Внедрение объектов Deferred в функции XHR
Вызов удаленных процедур