$.wwhen.apply($,someArray)的作用是什么
What does $.when.apply($, someArray) do?
我正在阅读关于延期和承诺的文章,并不断遇到$.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');
}
.apply
用于调用带有参数数组的函数。它接受数组中的每个元素,并将每个元素用作函数的参数。.apply
还可以改变函数内部的上下文(this
)。
那么,让我们取$.when
。人们常说"当所有这些承诺都得到解决时……做点什么"。它需要无限(可变)数量的参数。
就你而言,你有一系列的承诺;您不知道要传递给CCD_ 6的参数有多少。将数组本身传递给$.when
是行不通的,因为它希望其参数是promise,而不是数组。
这就是.apply
的作用所在。它接受数组,并以每个元素为参数调用$.when
(并确保this
设置为jQuery
/$
),因此一切都正常:-)
$.when获取任意数量的参数,并在所有这些参数都已解析时解析。
apply(thisValue,arrayParameters)调用函数anyFunction设置其上下文(thisValue将是该函数调用中的this),并将arrayParameters中的所有对象作为单个参数传递。
例如:
$.when.apply($, [def1, def2])
与相同
$.when(def1, def2)
但是apply的调用方式允许您传递未知数量的参数数组。(在你的代码中,你说你的数据来自一个服务,那么这是调用$的唯一方法。当时)
这里,代码有完整的文档。
// 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');
}
很遗憾,我不能同意你们的意见。
$.when.apply($, processItemsDeferred).always(everythingDone);
一旦一个延迟被拒绝,将立即调用everythingDone
,即使存在其他挂起的延迟。
这是完整的剧本(我推荐http://jsfiddle.net/):
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]));
}
processItemsDeferred.push($.Deferred().reject());
//processItemsDeferred.push($.Deferred().resolve());
$.when.apply($, processItemsDeferred).always(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(){
alert('processed all items');
}
这是个虫子吗?我想像上面描述的那位先生一样使用它。
也许有人会发现这很有用:
$.when.apply($, processItemsDeferred).then(everythingDone).fail(noGood);
在任何拒绝的情况下都不会调用everythingDone
$when单独使回调可以在传递给它的每个promise都被解析/拒绝时被调用。通常情况下,$.apply接受可变数量的参数时,使用.apply可以向其传递一个参数数组,这非常强大。有关.apply的更多信息:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/apply
感谢您的优雅解决方案:
var promise;
for(var i = 0; i < data.length; i++){
promise = $.when(promise, processItem(data[i]));
}
promise.then(everythingDone);
只有一点:当使用resolveWith
获取某些参数时,由于初始promise设置为未定义,因此会中断。我做了什么让它工作:
// Start with an empty resolved promise - undefined does the same thing!
var promise;
for(var i = 0; i < data.length; i++){
if(i==0) promise = processItem(data[i]);
else promise = $.when(promise, processItem(data[i]));
}
promise.then(everythingDone);
- 未设置变量的赋值| jQuery的作用是什么
- 这个脚本的作用是什么?(西部数字网站的一部分)
- clog()方法的作用是什么
- 这句话的作用是什么?console.log.bind(控制台)
- 角度控制器的作用是什么;t控制器'他的工作由指令来完成
- 标签在创建数据通道中的作用是什么以及如何正确使用它
- 连接两个字符串时 += 的作用是什么?(雄辩的JS嘶嘶声)
- MessageChannel 在 HTML5 中的主要作用是什么?
- 这个字符串参数在JavaScript函数中的作用是什么
- 字符||在JavaScript中的变量声明中的作用是什么
- firefox安全模式的作用是什么
- r.js真正的作用是什么
- prototype.constructor的作用是什么
- 控制器的作用是什么$viewValue/控制器$modelValue
- 直接函数的作用是什么?
- innerHTml在angular .js中的作用是什么?
- @符号在ES6和mixins中的作用是什么?
- 这个函数的作用是什么
- 变量(var)在Javascript中的作用是什么?
- “i”在“.each(function(i){})”中的作用是什么