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