Отложенное против обещания

83

В чем разница между Deferred и Promise, кроме версий jQuery?

Что мне следует использовать для своих нужд? Я только хочу назвать fooExecute(). Мне нужны только fooStart()и, например, fooEnd()для переключения статуса html div.

//I'm using jQuery v2.0.0
function fooStart() { /* Start Notification */ }
function fooEnd() { /* End Notification */ }
function fooExecute() { /* Execute the scripts */ }

$('#button1').on('click', function() {
    var deferred1 = $.Deferred();
    var promise1 = $.Promise();

    deferred1.???

    promise1.???
});
Fletchsod
источник
2
Вы не можете изменить состояние обещания. Таким образом, он обрабатывается логикой запроса (которая может не иметь никакого отношения к вмешательству в логику условий - для разрешения или отклонения) - ждать разрешения - из фабричной логики, которая фактически создала этот отложенный. Deferred можно изменить resolveили rejectизменить его состояние, что также будет отражено в его обещании. Скажите, как вы хотите использовать отсрочку для кликов?
Андревинский
Не думаю, что обещания могут принести пользу вашему примеру (или я этого не понимаю). Может быть, взгляните на Как можно использовать jQuery deferred? .
Felix Kling

Ответы:

131

Во-первых: вы не можете использовать, $.Promise();потому что его не существует.

Отложенный объект является объектом , который может создать обещание и изменить свое состояние resolvedили rejected. Отложенные функции обычно используются, если вы пишете свою собственную функцию и хотите предоставить обещание вызывающему коду. Вы производитель ценности.

Обещание , как говорит название, обещание о значении будущего. Вы можете прикрепить к нему обратные вызовы, чтобы получить это значение. Обещание было «дано» вам, и вы являетесь получателем будущей стоимости.
Вы не можете изменить состояние обещания. Только код, создавший обещание, может изменить его состояние.

Примеры:

1. ( произвести ) Вы используете отложенные объекты, когда хотите обеспечить поддержку обещаний для ваших собственных функций. Вы вычисляете значение и хотите контролировать выполнение обещания.

function callMe() {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve('some_value_compute_asynchronously');
    }, 1000);
    return d.promise();
}

callMe().done(function(value) {
    alert(value);
});

2. ( вперед ) Если вы вызываете функцию, которая сама возвращает обещание, вам не нужно создавать свой собственный отложенный объект. Вы можете просто вернуть это обещание. В этом случае функция не создает значение, а пересылает его (своего рода):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});

3. ( получение ) Иногда вы не хотите создавать или передавать обещания / значения, вы хотите использовать их напрямую, т.е. вы являетесь получателем некоторой информации:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});

Конечно, все эти варианты использования также можно смешивать. Ваша функция может быть получателем значения (например, из вызова Ajax) и вычислять (производить) другое значение на основе этого.


Связанные вопросы:

Феликс Клинг
источник
2

Обещание - это то, что вы можете установить для отложенного объекта, который выполняется после завершения отложенной коллекции.

Пример из документации jQuery :

<!DOCTYPE html>
<html>
<head>
  <style>
div {
  height: 50px; width: 50px;
  float: left; margin-right: 10px;
  display: none; background-color: #090;
}
</style>
  <script src="http://code.jquery.com/jquery-1.9.1.js"></script>
</head>
<body>

<button>Go</button>
<p>Ready...</p>
<div></div>
<div></div>
<div></div>
<div></div>


<script>
$("button").on( "click", function() {
  $("p").append( "Started...");

  $("div").each(function( i ) {
    $( this ).fadeIn().fadeOut( 1000 * (i+1) );
  });

  $( "div" ).promise().done(function() {
    $( "p" ).append( " Finished! " );
  });
});
</script>

</body>
</html>

Вот это в JSFiddle

Это запускает функцию для каждого divи выполняет .promiseкод, когда все .eachисполнения завершены.

Codeman
источник