2017-10-27 5 views
0

私はこのコードの部分がうまくいかない。ツリービューの一部を作っていると考えられます。関数が完了した後、klassification_ajaxのコールバックは機能するはずですが、whileループの異なる繰り返しで別のajaxが呼び出されるため、全く機能しません。私がチェックしたのは、1回の反復だけだった場合、それは他のajax呼び出しに干渉しないために機能しますが、2回目の反復になると同時に発生し、その結果としては動作しません。私はそれをステップバイステップで動作させるためにネストされたコールバックとしてそれらの反復を行う必要があることを認識しましたが、HOW ?????再帰的な方法でJSコールバックを使用するには?

var j = 2; 
    while (result['klass-' + j]) { 
     klass_id = result['klass-' + j]; 

     if (handled_klass.indexOf(result['klass-' + (j - 1)]) == -1) { 
      handled_klass.push(result['klass-' + (j - 1)]); 

      klassification_ajax(result['klass-' + (j - 1)], function() { 
       $('#all-klassifikation-' + result['klass-' + (j - 1)]).collapse('show'); 
       $('#klassifikation-' + klass_id).css("font-weight", "Bold"); 
      }); 
     } 
     else { 
      $('#klassifikation-' + klass_id).css("font-weight", "Bold"); 
     } 
     j++; 
    } 

答えて

1

クロージャを使用して、関数内に次のようなコードを含む別の関数を作成します。各反復で実行されます。あなたの問題は、Ajaxが非同期であり、ループが反復を終了する前に実行されないため、反復からの最後の値のみが戻ってくることです。

function Closure(item, klass_id){ 
    klassification_ajax(item, function() { 
     $('#all-klassifikation-' + item).collapse('show'); 
     $('#klassifikation-' + klass_id).css("font-weight", "Bold"); 
    }); 
} 

次に、この関数を実行します。

var j = 2; 

while (result['klass-' + j]) { 
    klass_id = result['klass-' + j]; 

    if (handled_klass.indexOf(result['klass-' + (j - 1)]) == -1) { 
     handled_klass.push(result['klass-' + (j - 1)]); 

     Closure(result['klass-' + (j - 1)], 'klass-' + j); 
    } else { 
     $('#klassifikation-' + klass_id).css("font-weight", "Bold"); 
    } 
    j++; 
} 

、このような2つの異なる機能、より多くのキューのような「ループ」を実行します一つとして、あなたもそれを実装することができ、他の方法は、ありますが、実際に要求を行い、成功コールバック内の1つの関数が再びキューを実行します。

+0

'Closure'の中で' result ['klass-' +(j-1)] 'の代わりに' item'でなければならず、 'klass_id'も渡す必要があります。 – aaron

+0

@aaronええ、コピー&ペーストエラーです。ありがとう。 – Adriani6

+0

それは、workss! ... yess ...あなたは私の人生を救った。ありがとう。 今、私はこのコールバック地獄に対処する方法を、もっとも簡単な方法で理解しています。 – JMJ

関連する問題