查看文档,$。Deferred和$ .Callbacks似乎做了非常类似的事情。我什么时候想要使用另一个?
答案 0 :(得分:1)
他们没有 very similar things
。 $.Callbacks
用作回调函数的容器,例如,假设您必须编写一个函数来接收10个回调(作为回调数组或每个作为参数),您必须循环回调数组并触发它们中的每一个,或写入10行代码(每个回调参数一个),现在,有$.Callbacks
,你可以将该对象传递给函数(之前已将10个回调推送到它通过使用add
方法),然后只需调用callbacks.fire()
,所有回调都将被触发。
没有$.Callbacks
和参数的示例:
function doSomethingAndThenFireManyCallbacks(cb1, cb2, cb3, cb4, cb5, cb6) {
//do something.
cb1();
cb2();
cb3();
cb4();
cb5();
cb6();
}
doSomethingAndThenFireManyCallbacks(fn1, fn2, fn3, fn4, fn5, fn6);
没有$.Callbacks
的示例和回调数组:
function doSomethingAndThenFireManyCallbacks(callbacks) {
//do something.
for (var i = 0; i < callbacks.length; i++) {
callbacks[i]();
}
}
doSomethingAndThenFireManyCallbacks(fn1, fn2, fn3, fn4, fn5, fn6);
$.Callbacks
的示例:
function doSomethingAndThenFireManyCallbacks(callbacks) {
//do something.
callbacks.fire();
}
var callbacks = $.Callbacks();
callbacks.add([fn1, fn2, fn3, fn4, fn5, fn6]);
doSomethingAndThenFireManyCallbacks(callbacks);
使用$.Callbacks
,您必须编写的代码更少,而且更容易阅读。
现在,根据$.Defered
的事情,这是jquery对promise api的实现,它是处理asynchronous
请求或进程的回调的另一种方法,其中而不是在请求/进程完成后传递一个回调来执行,你得到一个承诺,允许你链接你的函数。这样代码更容易阅读和调试,因为你的函数声明和它的使用在同一个地方,你不必猜测一个名为callback
的参数究竟是来自哪个函数。
无论如何,您应该阅读有关promises的更多信息,因为我的解释只是基本的,以便说明$.Callbacks
和$.Deferred
之间的差异。
答案 1 :(得分:1)
正如taxicala所提到的那样。$ .Callabcks用于管理回调列表。
$。当您需要监视AJAX /非阻塞函数的进度时使用延迟
Run this example to see the $.Deferred functionality
function nonBlocking() {
var defer = $.Deferred();
// setTimeout is a non-blocking function
setTimeout(function () {
alert('Non-Blocking function call after thread ends');
defer.resolve();
}, 0);
return defer;
}
// Now you can chain a done or fail handler to the method call
nonBlocking().done(function () {
alert('Non-Blocking function is done');
});
alert('End of main thread comes before the non-blocking function');