$.when.apply($, someArray) 有什么作用?

2022-08-30 05:19:52

我正在阅读有关延期和承诺的信息,并不断遇到.我有点不清楚这到底是做什么的,寻找一个解释,一行完全有效(而不是整个代码片段)。以下是一些上下文:$.when.apply($, someArray)

var data = [1,2,3,4]; // the ids coming back from serviceA
var processItemsDeferred = [];

for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

$.when.apply($, processItemsDeferred).then(everythingDone); 

function processItem(data) {
  var dfd = $.Deferred();
  console.log('called processItem');

  //in the real world, this would probably make an AJAX call.
  setTimeout(function() { dfd.resolve() }, 2000);    

  return dfd.promise();
}

function everythingDone(){
  console.log('processed all items');
}

答案 1

.apply 用于调用具有参数数组的函数。它采用数组中的每个元素,并将每个元素用作函数的参数。 还可以更改函数内部的上下文 ()。.applythis

因此,让我们以.它被用来说“当所有这些承诺都得到解决时......做点什么”。它需要无限(可变)数量的参数。$.when

在你的情况下,你有一系列的承诺;您不知道要传递给 多少个参数。将数组本身传递给将不起作用,因为它期望其参数是 promise,而不是数组。$.when$.when

这就是进来的地方。它采用数组,并将每个元素作为参数进行调用(并确保设置为 /),这样它就可以工作了 :-).apply$.whenthisjQuery$


答案 2

$.when 采用任意数量的参数,并在所有这些参数都已解析解析。

anyFunction.apply(thisValue, arrayParameters) 调用函数 anyFunction 设置其上下文(thisValue 将是该函数调用中的 this),并将 arrayParameters 中的所有对象作为单独的参数传递。

例如:

$.when.apply($, [def1, def2])

与以下相同:

$.when(def1, def2)

但是 apply 调用方式允许您传递未知数量的参数的数组。(在你的代码中,你说你的数据来自一个服务,那么这是调用$的唯一方法)