2010-07-04 6 views
0

나는 사용자가 (아약스를 통해) 데이터를 데이터베이스로 보내는 페이지를 가지고있다. 그러나 때로는 데이터베이스를 확인할 때 요청이 순서에 맞지 않는 경우가 있습니다.아약스 게시물 요청의 순서가 뒤섞여있다

기본적으로 사용자는 발생하는 이벤트를 입력하고 제출을 눌러 데이터베이스로 보냅니다. 때때로 사용자는 전송하기 전에 2 개의 이벤트를 기록하며,이 경우 2 개의 이벤트는 한 번에 하나씩 전송됩니다. 이 경우는 때때로 전환됩니다.

다음은 관련 코드입니다.

i = 0; 
    while (event[i]) { 

     var post_data = //post data for event[i] 

     $.ajax({ 
      type: "POST", 
      url: "save_event.php", 
      data: post_data, 
     }); 

     event.splice(0,1); 
    } 

이벤트 []은 사용자가 제출할 이벤트가 포함 된 배열입니다. 각 이벤트는 다양한 속성을 가진 객체입니다. 일반적으로 배열에는 객체가 하나 뿐이지 만 때로는 2 개가 있습니다. post_data가있는 부분은 3 행에 걸쳐 있기 때문에 제거했습니다.

아마 2 이벤트가있는 시간의 절반은 데이터베이스에서 되돌릴 수 있습니다. 내가 그걸 없앨 수있는 방법이 있니? 아니면 서버가 처리하는 데 걸리는 시간에 전적으로 달려 있으며 때로는 1 차 처리가 완료되기 전에 2 차 처리가 완료됩니다.

답변

2

AJAX 요청이 비동기 적으로 전송되고 병렬로 전송되기 때문에 이는 브라우저와 서버의 처리 시간에 따라 달라집니다. async: false 옵션을 추가 할 수 있지만 더 이상 비동기가 아니므로 요청 중에 브라우저가 고정됩니다.

데이터베이스에 주문 열을 추가하는 것이 좋습니다.

var post_data = { order: i, ... }; 

또 다른 옵션은 모든 데이터를 포함하는 단일 AJAX 요청을 보내는 것입니다.

+0

스크립트에서 멈춤을 넣을 수 있습니까, 예를 들어 루프의 끝 부분에 있습니까? setTimeout을 사용하여 .5 초 정도의 후속 요청을 지연시키는 것과 마찬가지로? 나는이 시간 동안 사용자가 여전히 페이지를 사용할 수 있기를 원한다. 사용자는 항목을 즉시 클릭해야 할 수도 있지만 다른 요청은 적어도 몇 초 후에 발생합니다. –

+1

순서를 유지하는 유일한 방법은 비동기 요청이 보내지면 더 이상 제어 할 수 없으므로 차단하는 것입니다. –

+0

맞아, 나는 통제력이 없다는 것을 이해한다. 내 루프의 끝에서 약간의 지연을 설정하면 요청을 약간 분리 할 수 ​​있을까요? 그래서 그것은 갈 것입니다 : 요청 - 5 지연 - 요청. 나는 그것이 주문을 구체적으로 통제하지 않는다는 것을 안다. 그러나 그것들이 서버에서 켜지는 것을 막기 위해 충분히 길게 분리 할 것이다. 그게 사용자에게 어떤 영향을 미칠까요? –

1

주문이 문제가되는 경우 순서 번호를 보내고 서버에서 확인하거나 모든 이벤트를 동시에 보냅니다.