Відкладено проти обіцянки


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.???
});


2
Ви не можете змінити стан обіцянки. Таким чином, він обробляється запитуючою логікою (яка, можливо, не має ніяких зусиль для втручання в логіку умов - вирішити або відхилити) - чекати вирішення - із заводської логіки, яка насправді створила цю відстрочку. Відстрочене може бути змінено resolveабо rejectзмінити стан, що також відображатиметься в його обіцянці. Скажіть, як ви хочете використовувати відкладені кліки?
Андревінський

Я не думаю, що ваш приклад міг би отримати користь від обіцянок (або я цього не розумію). Можливо, подивіться на тему Як можна використовувати відкладений jQuery? .
Фелікс Клінг,

Відповіді:


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виконання завершені.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.