我想创建一个包含1个或多个函数的JS数组,每个函数都有自己的参数(在闭包中提供),然后调用所有这些函数,并在调用all函数时进行回调。
基于answer for this question,我可以使用所需的参数创建1个函数:
var f = (function(value) {
return function(){myFunction(value);};
}(k));
我希望拥有其中的几个函数,调用它们,并在调用它们之后提供回调。
Here is a JSFiddle 试图这样做,并且不按我想要的方式工作(它从不调用我的3个函数)。
This JSFiddle ,使用jQuery.Deferred对象(它过早调用我的3个函数)。
我期望consle.log()输出的方式是:
do something first
f1 done variable one
f2 done variable two
f3 done variable three
all functions have completed
callback has been called
我错过了什么?我该如何解决这个问题?
编辑:将会调用未知数量的函数(在整个应用程序中任意设置),这就是我将它们推送到数组的原因。
答案 0 :(得分:1)
检查构造函数部分下的Deferred docs:
jQuery.Deferred可以传递一个可选函数,该函数在构造函数返回之前调用,并将构造的延迟对象作为this对象和函数的第一个参数传递。
也就是说,只要将函数传递给Deferred
构造函数,函数就会运行。因此,解决问题的一种可能方法是
f1
,f2
,f3
常规函数,接受dfd
参数并解析Deferred
中。 This Fiddle产生您的预期输出。
var v1 = 'variable one';
// array of functions to be called
var functions = [];
function callFunctions(callback) {
var deferreds = functions.map(function(x) {
return $.Deferred(x);
});
$.when.apply(null, deferreds).done(function(){
console.log('all functions have completed');
if( callback && typeof(callback)==='function' ) callback();
});
}
var f1 = (function(value) {
return function(dfd) {
console.log('f1 done',value);
dfd.resolve();
}
})(v1);
// this should be the first thing logged
console.log('do something');
functions.push(f1);
callFunctions(function() {
console.log('callback has been called');
});