$ .when,apply()和$ .done()如何在此函数中进行交互?

时间:2014-02-04 23:49:58

标签: javascript jquery ajax jquery-deferred

不久前,SO用户为我编写了这个函数,以返回可变数量的jQuery $.get()请求。第一部分非常简单,但有人会在$.when()apply()$.done()之间进行交互。我一般不了解,但非常具体地说他们是如何访问$.get()返回的延迟对象的。

function getHTML(qty_of_gets) {

   var dfdArr = [],
       i = 1;

   while (i <= qty_of_gets) {
       dfdArr.push($.get("get_test_" + i + ".php"));
       i++;
   }

   $.when.apply(null, dfdArr).done(function () {

       for (var i = 0; i < arguments.length; i++) {

           $("#content").append(arguments[i][0]);

       }

   });
}

3 个答案:

答案 0 :(得分:11)

$.when会返回一个新承诺,因此$.when().done()只会对.done返回的承诺调用$.when

.apply允许您使用数组中的参数调用函数,而不是单独传递它们。所以

$.when.apply(null, dfdArr)

(几乎*)相当于

$.when(dfdArr[0], dfdArr[1], dfdArr[2], ...);

dfdArr中的每个元素都是一个承诺。


*除了函数内的this值。

答案 1 :(得分:3)

$.get()返回Deferred对象。在此行中,您将创建一个充满Deferred实例的数组,每个请求对应一个请求:

dfdArr.push($.get("get_test_" + i + ".php"));

$.when()接受Deferred对象列表并返回自己的Deferred。当您解析的所有Deferred对象都已解析时,它也会解析。通常情况如下:

$.when(dfd1, dfd2).done(function (dfd1Result, dfd2Result) {
    // The parameters from dfd1.done and dfd2.done are here in dfd1REsult, dfd2Result
}

我们不想使用列表,我们想要使用数组。这就是.apply()的用武之地。这允许您使用延迟数组。

现在,我们的回调函数不知道它将具有多少结果,因此明确列出它们没有意义。通过查看任何函数中存在的arguments数组,我们基本上得到了一系列结果。

答案 2 :(得分:1)

代码创建一个表示AJAX请求(dfdArr)的延迟数组,并用while填充它。

之后apply使用$.when,以便将所有延迟传递给它作为参数。这样可以返回一个在所有初始延迟成功时,即所有AJAX请求都已返回时完成的promise。

换句话说,对apply的调用是编程

的程序化等价物
$.when(dfdArr[0], ..., dfdArr[qty_of_gets - 1]).done(...);