2010-04-20 5 views
0

내 코드가 비동기 적으로 작동하지 않는 이유를 이해하는 데 문제가 있습니다.내 아약스가 비동기로 작동하지 않는 이유

비동기 적으로 실행하면 get_price.php는 이전 경고가 고유 한 $ _GET 값을 출력하더라도 항상 동일한 $ _GET 값을받습니다.

var arraySize = "<? echo count($_SESSION['items']); ?>"; //get items count 
var pos = 0; 
var pid; 
var qty; 

getPriceAjax(); 
function getPriceAjax() 
{ 
    pid = document.cartItemForm.elements[pos].id; //product id 
    qty = document.cartItemForm.elements[pos].value; //quantity 
    alert('Product: ' + pid + ' Quantity: ' + qty); 

    $.ajax({ 
     url:"includes/ajax_php/get_price.php", 
     type:"GET", 
     data:'pid='+pid+'&qty='+qty, 
     async:true, 
     cache:false, 
     success:function(data){ 

      while(pos < arraySize) 
      {       
       document.getElementById(pid + 'result').innerHTML=data; 
       pos++; 
       getPriceAjax(); 
      } 
     } 
    }) 
} 
+0

나는 많은 경고를하지만 첫 번째 요청에서 데이터를 반환하는 코드를 arraySize 시간을 실행하는 걸릴까요? –

+0

예, 첫 번째 요청의 데이터를 저장하고이를 표시하는 것으로 보입니다. – payling

+0

첫 번째 응답을받는 즉시 모든 전화를 걸기 때문입니다. 데이터는 다른 요청이 반환되기 전에 arraySize와 동일한 것으로 설정됩니다. 후속 응답은 절대로 while 루프를 입력하지 않습니다. –

답변

0

...

대신 while 루프를 사용하는 그것은 경우 조건문되어 있어야합니다.

while(pos < ArraySize) 잘못된! - arraySize 매개 변수의 첫 번째 집합을 실행합니다.

if(pos < ArraySize) 정답! - 첫 번째, 두 번째 등을 실행합니다 ...

0

나는 비슷한 문제를 다뤘다. 무슨 일이 일어 났는지 기억이 나지 않아서이 답변이 도움이되지 않을 수도 있습니다. 서버가 응답을 캐싱 중일 수 있습니다. POST를 사용해보십시오. 서버가과 같이, 그것을 캐시하지 않습니다 귀하의 가져 오기 URL에 임의의 숫자의 비트를 추가

+0

행운과 함께 POST에 type/vars 설정을 시도했습니다. 입력 해 주셔서 감사합니다. – payling

0

시도 :

url:"includes/ajax_php/get_price.php&rnd=" + Math.floor(Math.random()*10000) 

는 또한 타이밍 문제 일 수 있습니다. 비동기식이기 때문에 값이 돌아 오기 전에 루프를 단계별로 실행하고 경고 할 수 있습니다. pos 카운터는 돌아올 때까지 증가하지 않으므로 호출이 다시 나타날 때까지 항상 pos = 0의 가격을 갖게됩니다. 나는 증분자를 성공 함수 밖으로 옮길 것이다. 또한 성공 함수 내에서 경고를 이동하십시오. 재귀 거의 나를 이길

function getPriceAjax() 
{ 
    pid = document.cartItemForm.elements[pos].id; //product id 
    qty = document.cartItemForm.elements[pos].value; //quantity 

    $.ajax({ 
     url:"includes/ajax_php/get_price.php", 
     type:"GET", 
     data:'pid='+pid+'&qty='+qty, 
     async:true, 
     cache:false, 
     success:function(data){ 

      while(pos < arraySize) 
      { 
       alert('Product: ' + pid + ' Quantity: ' + qty);       
       document.getElementById(pid + 'result').innerHTML=data;     
       getPriceAjax(); 
      } 
     } 
    }); 
    pos++; 
} 
+0

데이터 필드에 rnd를 추가했지만 변경하지 않았습니다. – payling

+0

나는 위의 대답을 편집하여 다른 아이디어를 보여주었습니다. 비동기로 인한 타이밍 문제 일 수 있습니다. – ashurexm

관련 문제