почему мой AJAX не работает асинхронно - PullRequest
0 голосов
/ 20 апреля 2010

Мне сложно понять, почему мой код не будет работать асинхронно.

При асинхронном запуске 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();
            }
        }
    })  
}

Ответы [ 3 ]

0 голосов
/ 20 апреля 2010

Попробуйте добавить немного случайного числа в ваш URL-адрес get, чтобы сервер не кэшировал его, например:

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 голосов
/ 21 апреля 2010

рекурсия чуть не победила меня ...

Вместо использования цикла while это должен был быть условный оператор if.

while(pos < ArraySize) НЕПРАВИЛЬНО! - выполняет первый набор параметров arraySize times.

if(pos < ArraySize) ПРАВИЛЬНО! - выполняет первое, потом второе и так далее ...

0 голосов
/ 20 апреля 2010

Я имел дело с подобной проблемой. Я не могу вспомнить, что происходило, поэтому этот ответ может быть не слишком полезным. Ваш сервер может кэшировать ответ. Попробуйте использовать POST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...