Внедрение объектов Deferred в функции XHR

Еще одна замечательная особенность объекта Deferred состоит в том, что он обеспечивает очевидный способ отмены асинхронного действия до его полного завершения. Ниже приводится доработанная версия нашего предыдущего примера, демонстрирующая возможность отменить уже выполняющийся запрос, а также – «внедрение» объекта Deferred в обработчики load и error:
<html>
<head>
<title>Fun with Deferreds!</title>
<script type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js">
</script>
<script type="text/javascript">
dojo.addOnLoad(function() {
var d = new dojo.Deferred;
//Добавить несколько функций обратного вызова
d.addCallback(
function(result) {
console.log("Callback 1 says that the result is ",
result);
return result;
}
);
d.addCallback(
function (result) {
console.log("Callback 2 says that the result is ",
result);
return result;
}
);
//Добавить несколько функций обработки ошибок
d.addErrback(
function(result) {
console.log("Errback 1 says that the result is ",
result);
return result;
}
);
d.addErrback(
function(result) {
console.log("Errback 2 says that the result is ",
result);
return result;
}
);
//Вызвать функцию, запускающую асинхронный запрос,
//которая вернет объект Deferred
request = dojo.xhrGet({
url: "http://localhost:8080",
timeout : 5000,
load : function(response, ioArgs) {
console.log("Load response is:", response);
console.log("Executing the callback chain now...");
//внедрить нашу цепочку функций обратного вызова
d.callback(response, ioArgs);
//позволить продолжить обработку цепочке объекта
//Deferred функции xhrGet...
return response;
},
error : function(response, ioArgs) {
console.log("Error!", response);
console.log("Executing the errback chain now...");
//внедрить нашу цепочку обработчиков ошибок
d.errback(response, ioArgs);
//позволить продолжить обработку цепочке объекта
//Deferred функции xhrGet...
return response;
}
});
});
</script>
</head>
(body)
XHR request in progress. You have about 3 seconds to cancel it.
(button onclick="javascript:request.cancel()")Cancel(/button)
(/body)
</html>


Если запустить этот пример, в консоли Firebug можно наблюдать следующий вывод:
xhrGet just fired. Waiting on callbacks or errbacks now...
Load response is: Hello
Executing the callback chain now...
Callback 1 says that the result is Hello
Callback 2 says that the result is Hello

А щелчок на кнопке «Cancel» (отмена) приведет к появлению следующих результатов:
xhrGet just fired. Waiting on callbacks or errbacks now...
Press the button to cancel...
Error: xhr cancelled dojoType=cancel message=xhr cancelleddojo.xd.js (line 20)
Error! Error: xhr cancelled dojoType=cancel message=xhr cancelled
Executing the errback chain now...
Errback 1 says that the result is Error: xhr cancelled dojoType=cancel
message=xhr
cancelled
Errback 2 says that the result is Error: xhr cancelled dojoType=cancel
message=xhr
cancelled
Теги:
AJAX
Добавлено: 24 Июля 2018 20:45:09 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...