JQuery:Deferred vs Callbacks

时间:2015-11-05 22:38:21

标签: jquery

查看文档,$。Deferred和$ .Callbacks似乎做了非常类似的事情。我什么时候想要使用另一个?

回调:https://api.jquery.com/category/callbacks-object/

延期:https://api.jquery.com/category/deferred-object/

2 个答案:

答案 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');