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

私は何が欠けていますか?この問題を解決するにはどうすればよいですか?

EDIT:呼び出される関数の数は不明です(アプリケーション全体から任意に設定されます)。そのため、それらを配列にプッシュしています。

4

1 に答える 1

1

コンストラクターセクションの下の遅延ドキュメントを確認してください。

jQuery.Deferredにはオプションの関数を渡すことができます。この関数は、コンストラクターが戻る直前に呼び出され、構築された遅延オブジェクトをthisオブジェクトと関数の最初の引数の両方として渡します。

つまり、関数はDeferredコンストラクターに渡されるとすぐに実行されます。したがって、この問題を解決する1つの可能な方法は、

  1. パラメータを受け入れて解決する通常の関数を作成f1します。f2f3dfd
  2. Deferredそれらを実行する準備ができたとき にのみ、それらをラップします。

このフィドルは、期待される出力を生成します。

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 に答える