2013-12-11 3 views
0

PLAY Framework 2.2.1을 사용하여 검색 엔진을 구축 중이며 결과를 나열하는 데 문제가 있습니다. 검색 결과는 프레임 워크에서 제공하는 캐시에 저장되며 uniqe id를 사용하여 액세스 할 수 있습니다. 결과를 한꺼번에 모두 표시하지 않으려면 결과 목록을 아약스를 통해 청크로 가져와야합니다. 결과 사이트가로드 된 후 첫 번째 부분과 특정 스크롤 이벤트가 발생할 때마다 나머지 부분. javascript의 ajax 함수가 여러 번 실행되는 것을 방지하는 방법

이제 문제는 결과 중 일부는 여러 번 나열되고 경고 메시지가 기능 말해 것입니다 next_results 때로는 변수 POS 두 번 이상 동일한 값으로 실행됩니다. 이 문제를 방지하려면 변수를 처리하는 을 사용하십시오. 그러나이 방법은 올바르게 작동하지 않습니다.

var processing = false; 
var not_finished = true; 
var pos = 0; 
function next_results(uuid, result_size){ 
    alert("input\n" + result_size + " result_size\ncurrent_position" + pos); 

    jsRoutes.controllers.Application.getResults(uuid, pos, result_size).ajax({ 
     success : function(data) { 
       var len = data.length; 
//    alert("input\n" + result_size + " result_size\ncurrent_position" + pos + "\n result_length" + len); 
       pos = pos + len; 
       if (len == 0){ 
        not_finished = false; 
       } else { 
        for (var i = 0; i < len; i++) { 
         var result= data[i]; 
         $('#results').append(result.string); 
        }; 
       } 
      } 
    }); 
} 

var uuid; 
function set_uuid (x){ 
    uuid = x; 
} 


$(document).ready(function(){ 
    //initial 
    if (!processing){ 
     processing = true; 
     next_results(uuid, 10); 
     processing = false; 
    } 

    $(document).scroll(function(e){ 

     if (processing) 
      return false; 

     if (not_finished && $(window).scrollTop() >= $(document).height() - $(window).height() - 300){ 
      processing = true; 
      next_results(uuid, 2); 
      processing = false; 
     } 
    }); 
}); 

고유 ID가 (스칼라를 통해) HTML 코드에서 설정됩니다

<script>set_uuid('@uuid');</script> 
+0

경고를 할 필요가 ? 당신 console.log (obj)가 납치 됐나요? – biesior

+0

귀하의 조언에 감사드립니다, biesior, 나는 꽤 웹 개발에 새로운입니다. 아래 내 질문에 답해 줄 수 있습니까? –

+0

정말 행운! ;) – biesior

답변

2
 next_results(uuid, 2); 
     processing = false; <-- WRONG 

당신은 JS 디버깅 성공 기능에

success : function(data) { 
    ... 
    ...   
    processing = false; 
} 
+0

나는 웹 개발에 아주 익숙하다. 설명 해줄 수 있니? –

+0

가 작동하는 것 같습니다. 정말 쉬운 해결책 :-) –

+0

어떻게 처음에 next_results를 3 ~ 4 번 실행할 수 있습니까? 쓰기 if (! processing) { processing = true; next_results (uuid, 2); processing = true; next_results (uuid, 2); processing = true; next_results (uuid, 2); } 같은 결과 두 번 3 번을 반환합니다. –

관련 문제