我只是想揭开方法$.Deferred
在jQuery中的工作原理。我知道它主要用于AJAX的东西,但我也想把这个方法用于非AJAX的东西。我正在阅读the jQuery documentation这个方法,并遇到了以下代码:
$.fn.bindOnce = function( event, callback ) {
var element = $( this[ 0 ] ),
defer = element.data( "bind_once_defer_" + event );
if ( !defer ) {
defer = $.Deferred();
function deferCallback() {
element.unbind( event, deferCallback );
defer.resolveWith( this, arguments );
}
element.bind( event, deferCallback )
element.data( "bind_once_defer_" + event , defer );
}
return defer.done( callback ).promise();
// what is this piece of code really doing and why is it necessary ?
};
...现在,如果你逐行浏览代码,那么很容易就会发生什么事情。
jQuery文档告诉我们一行一行的发生情况,如下:
- 检查元素是否已为给定事件附加了延迟
- 如果没有,请创建它并使其在第一次触发事件时解决。
- 然后将给定的回调附加到延期并返回承诺。
我遇到的困难以及我无法理解的界限如下:
return defer.done( callback ).promise();
我无法理解这行代码的目的以及为什么它有用以及promise方法在这种情况下究竟做了什么?
任何人都可以解释一下吗?
答案 0 :(得分:2)
promise()
为延迟创建 promise 对象。 promise对象公开了延迟时可用的方法的子集;允许客户注册事件处理程序到各种事件,但不修改延迟本身。
来自jQuery docs:
promise对象提供
Deferred
对象(then
,done
,fail
,always
,pipe
方法的子集,progress
,state
和promise
),以防止用户更改已延期的状态。
因此,
return defer.done( callback ).promise();
...正在添加要在延迟(callback
)解析时执行的defer
函数,然后返回延迟的相应承诺。
您可能会发现以下问题很有用; What are the differences between Deferred, Promise and Future in JavaScript?