В чем разница между 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.???
});
jquery
jquery-deferred
promise
Fletchsod
источник
источник
resolve
илиreject
изменить его состояние, что также будет отражено в его обещании. Скажите, как вы хотите использовать отсрочку для кликов?Ответы:
Во-первых: вы не можете использовать,
$.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) и вычислять (производить) другое значение на основе этого.
Связанные вопросы:
источник
Обещание - это то, что вы можете установить для отложенного объекта, который выполняется после завершения отложенной коллекции.
Пример из документации 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
исполнения завершены.источник