多次将参数传递给匿名函数,当所有完成时提供回调

时间:2012-12-12 21:59:11

标签: javascript closures

我想创建一个包含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

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

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

1 个答案:

答案 0 :(得分:1)

检查构造函数部分下的Deferred docs

  

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

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

  1. 制作f1f2f3常规函数,接受dfd参数并解析
  2. 只有在您准备好运行它们时才将它们包裹在Deferred中。
  3. 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');
    });​