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

Отложенные по сравнению с обещанием

В чем разница между отложенными и обещаниями, отличными от версий 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.???
});
4b9b3361

Ответ 1

Первое: вы не можете использовать $.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 исполнения завершены.