首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >$.when.apply($,someArray)做什么?

$.when.apply($,someArray)做什么?
EN

Stack Overflow用户
提问于 2013-02-09 00:27:56
回答 7查看 81.4K关注 0票数 115

我是经常遇到$.when.apply($, someArray)reading about Deferreds and Promises。我不太清楚这到底是做什么的,我在寻找一个解释,说明一行确实有效(而不是整个代码片段)。下面是一些上下文:

代码语言:javascript
复制
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');
}
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-02-09 00:34:27

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

那么,让我们以$.when为例。它用来说“当所有这些承诺都解决了……做点什么”。它接受无限(可变)数量的参数。

在您的示例中,您有一系列的promises;您不知道要传递给$.when的参数有多少。将数组本身传递给$.when是行不通的,因为它希望它的参数是promises,而不是数组。

这就是.apply的用武之地。它接受数组,并使用每个元素作为参数调用$.when (并确保将this设置为jQuery/$),这样一切都可以正常工作:-)

票数 168
EN

Stack Overflow用户

发布于 2013-02-09 00:40:03

$.when接受任意数量的参数,并在所有这些参数都已解析时进行解析。

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

例如:

代码语言:javascript
复制
$.when.apply($, [def1, def2])

与以下内容相同:

代码语言:javascript
复制
$.when(def1, def2)

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

票数 64
EN

Stack Overflow用户

发布于 2013-02-09 00:36:57

在这里,代码完全记录在案。

代码语言:javascript
复制
// 1. Declare an array of 4 elements
var data = [1,2,3,4]; // the ids coming back from serviceA
// 2. Declare an array of Deferred objects
var processItemsDeferred = [];

// 3. For each element of data, create a Deferred push push it to the array
for(var i = 0; i < data.length; i++){
  processItemsDeferred.push(processItem(data[i]));
}

// 4. WHEN ALL Deferred objects in the array are resolved THEN call the function
//    Note : same as $.when(processItemsDeferred[0], processItemsDeferred[1], ...).then(everythingDone);
$.when.apply($, processItemsDeferred).then(everythingDone); 

// 3.1. Function called by the loop to create a Deferred object (data is numeric)
function processItem(data) {
  // 3.1.1. Create the Deferred object and output some debug
  var dfd = $.Deferred();
  console.log('called processItem');

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

  // 3.1.3. Return that Deferred (to be inserted into the array)
  return dfd.promise();
}

// 4.1. Function called when all deferred are resolved
function everythingDone(){
  // 4.1.1. Do some debug trace
  console.log('processed all items');
}
票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14777031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档