2017-10-27 2 views
0

이 코드 부분이 작동하지 않습니다. 트리 뷰의 일부분을 만드는 것으로 가정합니다. 함수가 완료된 후 klassification_ajax에 대한 콜백이 작동해야하지만 while 루프의 다른 반복에서 다른 아약스 호출이 호출되면 전혀 작동하지 않습니다. 나는 하나의 반복만을 가졌다면 다른 아약스 호출을 간섭하지 않기 때문에 작동하지만 두 번째 반복을 위해 갈 때 동시에 발생하고 결과적으로 아무 것도 작동하지 않는다. 다음 단계로 작동하도록 중첩 콜백으로 이러한 반복을해야한다는 것을 알았지 만, 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++; 
} 

같은 두 가지 기능, 더 큐와 같은 '루프'를 실행 하나, 실제로 요청 및 성공 콜백을 만드는 하나 개의 함수가 다시 큐를 실행으로 너무 그것을 구현할 수있는 다른 방법이 있습니다 .

+0

'Closure' 안에'result [ 'klass-'+ (j-1)]'대신'item'이어야하고'klass_id'도 전달해야합니다. – aaron

+0

@aaron 예, 복사 및 붙여 넣기 오류입니다. 감사. – Adriani6

+0

그게 다야! 너는 내 목숨을 구했다. 감사. 이제이 콜백 지옥을 가장 간단한 방법으로 처리하는 방법을 알게되었습니다. – JMJ

관련 문제