推迟与承诺

除了jQuery版本之外,Deferred和Promise有什么区别?

我应该用什么来满足我的需要? 我只想调用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.??? }); 

第一:你不能使用$.Promise(); 因为它不存在。

延迟对象是可以创build承诺并将其状态更改为已resolved或已rejected 。 如果您编写自己的函数并希望为调用代码提供承诺,则通常会使用延迟。 你是价值的生产者

正如名称所言,承诺是对未来价值的承诺。 您可以附加callback来获取该值。 这个诺言是“给予”给你的,你是未来价值的接受者
你不能修改承诺的状态。 只有创build承诺的代码才能更改其状态。

例子:

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.( 转发 )如果你正在调用一个函数本身返回一个承诺,那么你不必创build自己的延期对象。 你可以回报这个承诺。 在这种情况下,函数确实会创build一个值,但转发它(种类):

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

3.( 接收 )有时你不想创build或传递承诺/值,你想直接使用它们,即你是一些信息的接收者:

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

当然,所有这些用例也可以混合使用。 你的函数可以是一个值的接收者(例如来自Ajax调用),并基于此值计算(产生)不同的值。


相关问题:

  • JavaScript中的Deferred,Promise和Future有什么区别?
  • Deferred对象和它自己的promise对象之间有什么区别?

承诺是您可以在延迟收集完成时执行的延迟对象上设置的。

jQuery文档示例:

 <!DOCTYPE html> <html> <head> <style> div { height: 50px; width: 50px; float: left; margin-right: 10px; display: none; background-color: #090; } </style> <script src="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上运行一个函数,并在所有.each执行完成时执行.promise代码。