Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript $.when、apply()和$.done()如何在此函数中交互?_Javascript_Jquery_Ajax_Jquery Deferred - Fatal编程技术网

Javascript $.when、apply()和$.done()如何在此函数中交互?

Javascript $.when、apply()和$.done()如何在此函数中交互?,javascript,jquery,ajax,jquery-deferred,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.pu

不久前,一位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]);

       }

   });
}
函数getHTML(获取的数量){
var dfdArr=[],
i=1;

while(i
$.when
返回一个新的承诺,所以
$.when().done()
只调用
.done
$.when
返回的承诺

允许您使用数组中的参数调用函数,而不是单独传递参数

$.when.apply(null, dfdArr)
(几乎*)相当于

$.when(dfdArr[0], dfdArr[1], dfdArr[2], ...);
dfdArr
中的每个元素都是承诺



*除了函数中的
值之外,此
值。

代码创建一个表示AJAX请求的延迟数组(
dfdArr
),并在
中填充

之后,
apply
$上使用。当
时,所有这些延迟都作为参数传递给它。这会产生返回承诺的效果,当所有初始延迟都成功时,即当所有AJAX请求都返回时,该承诺就会完成

换句话说,调用
apply
相当于编写程序

$.when(dfdArr[0], ..., dfdArr[qty_of_gets - 1]).done(...);
$.get()
返回一个延迟对象。在这一行中,您创建了一个包含延迟实例的数组,每个延迟实例对应一个发生的请求:

dfdArr.push($.get("get_test_" + i + ".php"));
$。when()
接受延迟对象列表并返回其自己的延迟对象。当您提供给它的所有延迟对象都已解析时,它也会解析。通常情况下,这类似于:

$.when(dfd1, dfd2).done(function (dfd1Result, dfd2Result) {
    // The parameters from dfd1.done and dfd2.done are here in dfd1REsult, dfd2Result
}
我们不想使用列表,我们想使用数组。这就是
.apply()
的作用。这允许您使用延迟数组


现在,我们的回调函数不知道它将有多少个结果,因此显式列出它们是没有意义的。我们基本上通过查看
参数
数组来获得一个结果数组,该数组存在于任何函数中。

谢谢。为什么“几乎”呢在括号中?传递给
.apply
的第一个参数是该
在函数中引用的值。
$。when.apply(null…)
表示
将默认为
窗口
对象。when(…)
将引用
$
,即jQuery。这可能会对实际使用
的函数产生巨大影响。