В чем разница между отложенным объектом и собственным объектом обещания? - PullRequest
28 голосов
/ 10 ноября 2011

Давайте создадим простой отложенный объект:

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() и получить обещать объект? Какова цель объекта обещания? Почему эта функциональность избыточна?

Ответы [ 3 ]

25 голосов
/ 10 ноября 2011

Создает «запечатанную» копию отложенного значения без методов .resolve() и .reject(). С документация :

Метод deferred.promise() позволяет асинхронной функции предотвращать вмешательство другого кода в ход выполнения или состояние его внутреннего запроса.

Используется, когда не имеет смысла изменять значение. Например, когда jQuery делает запрос AJAX, он возвращает объект обещания. Внутренне это .resolve() s значение для исходного Deferred объекта, которое пользователь наблюдает с обещанием.

2 голосов
/ 18 декабря 2013

При использовании «обещания» объекта Deferred наблюдатели (объекты, ожидающие разрешения для примера) не имеют прямого доступа к самому объекту Deferred, поэтому они не могут, например, вызвать метод «Resolve» этого объекта. Отложенный. Это способ защитить оригинал Deferred.

0 голосов
/ 12 ноября 2015

С помощью Deferred вы можете контролировать его состояние set.

Когда дело доходит до Обещания, вы можете прочитать состояние и, возможно, присоединить обратный вызов.get

...