6

私のコードには、関数呼び出しの配列があります。これらの呼び出しをループし、.apply() を使用して呼び出します。問題は、新しい関数の呼び出しに時間がかかる場合、ループが .apply() を実行し、前の関数が終了する前に次の関数を呼び出すことです。>.< 次に例を示します。

function someFunc(element, calls){
  if(calls.length){
    fn = calls[0];
    calls.shift();
    fn.apply(element, args);
    someFunc(element, calls);
  }
}

したがって、適用関数にコールバックがあった場合、これは私が望むように機能する可能性があります。すなわち

function someFunc(element, calls){
  if(calls.length){
    fn = calls[0];
    calls.shift();
    fn.apply(element, args, function(){
      someFunc(element, calls);
    });
  }
}

コールバック関数内で someFunc を呼び出すことについても質問があります。calls配列内の関数はelement変数に影響します。したがって、変更された後、コールバックで someFunc に渡されることを確認して、次の関数もそれを操作できるようにしたいと考えています。this文脈に惑わされてしまうこともあります。:)

それが役立つ場合、私はjQueryを使用しています。jQuery メソッドにコールバックを追加する方法は知っていますが、ネイティブの JavaScript コードを扱っているときにその方法を知りません。.apply() メソッドにコールバックを追加するにはどうすればよいですか?

4

1 に答える 1

3

呼び出すすべての関数がpromise. 次に、リスト内の次の関数に進む前に、その promise が「解決」されるのを「待つ」ことができます。

function someFunc(element, calls) {
    if (calls.length) {
        var fn = calls.shift();
        fn.apply(element, args).done(function(el) {  // what's args?
            el = el || element;   // default to previous element if necessary
            someFunc(el, calls);
        });
    }
}

各関数は次のようになります。

function myFunc1(el) {
    var def = $.Deferred();

    // do something async, and "resolve" the deferred object in the async callback
    ...(function() {
        def.resolve(el);  // this "el" will get passed to the next function
    });

    return def.promise();
}

非同期タスクが AJAX 呼び出しの場合、新しい遅延オブジェクトを作成する代わりに、直接jqXHR結果を返すことができます。$.ajax

于 2012-08-29T18:47:22.290 に答える