Отсрочка против обещания

В чем разница между 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.???
});

person fletchsod    schedule 25.06.2013    source источник
comment
Возможная помощь?   -  person Codeman    schedule 26.06.2013
comment
Вы не можете изменить состояние промиса. Таким образом, он обрабатывается логикой запроса (которая может не иметь никакого отношения к вмешательству в логику условий - разрешить или отклонить) - ждать разрешения - из фабричной логики, которая фактически создала отложенное. Deferred может быть resolved или rejected, изменяя свое состояние, что также будет отражаться в его промисе. Скажите, как вы хотите использовать отложенные платежи для кликов?   -  person Andrevinsky    schedule 26.06.2013
comment
Я не думаю, что ваш пример мог бы выиграть от обещаний (или я этого не понимаю). Возможно, взгляните на Как можно использовать отложенный jQuery? .   -  person Felix Kling    schedule 26.06.2013


Ответы (2)


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

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

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

Примеры:

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

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. (forward) Если вы вызываете функцию, которая сама возвращает обещание, вам не нужно создавать собственный отложенный объект. Вы можете просто вернуть это обещание. В этом случае функция не создает значение, а пересылает его (вроде):

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) и вычислять (генерировать) другое значение на основе этого.


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

person Felix Kling    schedule 25.06.2013

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

Пример из документации 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 выполнения завершены.

person Codeman    schedule 25.06.2013