Подтвердить что ты не робот

Какая разница между объектом Отложенного и его собственным объектом обещания?

Позвольте создать простой объект "Отложенный" :

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

4b9b3361

Ответ 1

Он создает "запечатанную" копию отложенного значения без методов .resolve() и .reject(). Из документация:

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

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

Ответ 2

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

Ответ 3

С "Отложенным" вы можете управлять своим состоянием set.

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