Давайте создадим простой отложенный объект:
defer = $.Deferred( function ( defer ) {
setTimeout( defer.resolve, 3000 );
});
Вышеупомянутый отложенный объект будет находиться в состоянии «ожидания» в течение 3 секунд, а затем переключится в состояние «разрешено» (после этого будут вызваны все связанные с ним обратные вызовы).
Давайте также получим обещание этого отложенного объекта:
promise = defer.promise();
Теперь, чтобы добавить обратные вызовы, которые будут вызываться после разрешения отложенного объекта, мы можем использовать .done()
или .then()
. Однако мы можем вызвать этот метод и для самого Отложенного объекта или для его собственного объекта обещания.
defer.then( handler );
или
promise.then( handler );
В обоих случаях будет вызываться функция handler
(в данном случае через 3 секунды).
Если мы используем $.when
, мы снова можем передать сам Отложенный объект или объект его обещания:
$.when( defer ).then( handler );
или
$.when( promise ).then( handler );
Опять же, нет никакой разницы между двумя приведенными выше строками кода.
Демонстрационная версия: http://jsfiddle.net/G6Ad6/
Итак, мой вопрос в том, что мы можем вызвать .then()
, .done()
и т. Д. Для самого Отложенного объекта и поскольку мы можем передать этот Отложенный объект в $.when()
, в чем смысл .promise()
и получить обещать объект? Какова цель объекта обещания? Почему эта функциональность избыточна?