不久前,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]);
}
});
}
答案 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(...);