1

我想创建一个包含 1 个或多个函数的 JS 数组,每个函数都有自己的参数(在闭包中提供),然后调用所有这些函数,并在调用所有函数时进行回调。

根据这个问题的答案,我可以创建 1 个带有所需参数的函数:

var f = (function(value) {
    return function(){myFunction(value);};
}(k));

我想拥有其中的几个函数,全部调用它们,并在全部调用后提供回调。

这是一个尝试执行此操作的 JSFiddle,但不能按我想要的方式工作(它从不调用我的 3 个函数)。

这个 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

我错过了什么?我该如何解决这个问题?

编辑:将调用未知数量的函数(从整个应用程序中任意设置),这就是我将它们推送到数组的原因。

4

1 回答 1

1

检查构造函数部分下的延迟文档:

jQuery.Deferred 可以传递一个可选函数,该函数在构造函数返回之前被调用,并将构造的延迟对象作为 this 对象和函数的第一个参数传递。

也就是说,只要将函数传递给Deferred构造函数,它们就会运行。因此,解决该问题的一种可能方法是

  1. make f1, f2,f3常规函数,接受dfd参数并解析它
  2. Deferred仅当您准备好运行它们时才 将它们包装起来。

这个 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');
});​
于 2012-12-12T22:14:15.597 回答