2012-09-28 3 views
0

목록을 계속 확인하여 사용 가능한 항목을 찾을 수 있습니다. 목록의 각 항목에 대해 항목을 사용할 수 있는지 확인하라는 게시물 요청을합니다. 비동기로 유지하고 싶습니다. 또한 내가 대기열 스크립트를 사용하고 있기 때문에 ajaxq 함수가 아닌 ajaxq 함수를 사용하고 있음을 유의하십시오. http://code.google.com/p/jquery-ajaxq/. 그것이 시작되기 전에 끝나지 않을 것입니다. 나는 thats 문제가 아니다라고 확신한다.자바 스크립트 : 루프에서 깨기

일단 함수를 사용할 수있게되면 루프를 벗어나는 방법이 필요합니다. 따라서 함수 내에서 루프를 벗어날 수 없기 때문에 콜백 함수를 사용할 수 없습니다. 그래서 변수를 증가시키고 do-while 루프를 사용하면 변수가 증가한다고 생각했지만 끊이지 않는 루프처럼 브라우저를 고정시킵니다.

이 문제를 해결하는 방법에 대한 제안이나 더 좋은 방법은 좋을 것입니다.

do { 

    var d = 0; 
    for(var i in list) { 

     var item = list[i]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 
       'newItem': item, 
       'purchaseItem': false 
      }, 
      error: function(jqXHR, textStatus) { 
       alert(textStatus); 
      }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { 
        d++; 
        thisObject.claimItem(); 
       } 
      } 
     }); 
    } 

} while(d == 0); 
+2

이 좋은 프로그래밍 방법이 아닙니다. –

+0

그런 다음 제안 사항이 있습니까? – user1684699

답변

1
당신은 재귀 함수 사용할 수 있습니다

: 요청 만 대기 두 번째가 시작되기 전에 그들이 seuqentially 실행됩니다, 그리고 첫 번째 요청이 완료됩니다 보장됩니다

function ChangeItem(list, index) { 
     var item = list[index]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 'newItem': item, 'purchaseItem': false }, 
      error: function(jqXHR, textStatus) { alert(textStatus); }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { thisObject.claimItem(); doWhateverYouWantNext(); } 
       else ChangeItem(list, index+1); 
      } 

     }); 
} 
+0

정확한 방법을 알려 주셔서 감사합니다. – user1684699

1

사실을 . 두 번째 요청을 대기열에 추가하는 코드가 첫 번째 요청이 완료 될 때까지 대기한다는 의미는 아닙니다. 그래서 ajaxq 여기에서 당신을 도울 수 없습니다. AJAX 콜백에서 호출하는 재귀 함수로 돌아 가야합니다.

그러면 서버에 일련의 요청이 발생하고 일련의 데이터베이스 조회가 발생할 수 있습니다. 전체 항목 목록을 서버에 보내고 거기에서 첫 번째 일치 항목을 반환하는 것이 훨씬 간단한 방법 일 수 있습니다.

0

이 시도하십시오

var d = 0; 
for(var i in list) { 

    if(d == 0) 
    { 
     var item = list[i]; 

     $.ajaxq('queue', { 
      type: 'POST', 
      url: baseURL + '/ChangeItem/Check', 
      data: { 
       'newItem': item, 
       'purchaseItem': false 
      }, 
      error: function(jqXHR, textStatus) { 
       alert(textStatus); 
      }, 
      dataType: 'text', 
      success: function(data) { 
       if(thisObject.isNotTaken(data)) { 
        d++; 
        thisObject.claimItem(); 
       } 
      } 
     }); 

    } 
} 
관련 문제