php и ajax работают долго

128
06 февраля 2020, 13:00

Есть корзина товаров, работает с помощью сессии, а также php обработчик и js файл, который шлет Ajax запросы в обработчик.

Так вот, допустим у нас 10 товаров в корзине. Теперь я удаляю их по одному.

Если это делать медленно, то все пройдет успешно.

Если нажимать на крестики быстро, то могут удалиться не все товары (они не успевают) или, если удалятся все, то количестве товаров в корзине и итоговая сумма могут не обнулиться до конца.

Почему так происходит?

Пример Ajax запроса:

//Обновление виджета корзины в шапке
function updateCart() {
    $.post('/wp-admin/admin-ajax.php', {
        action: 'updateCart'
    },
        function (res) {
            $('.cart-btn').html(res);
        }
    );
}
updateCart();

Пример PHP обработчика:

function updateCart(){
    $data = json_decode(stripslashes($_SESSION['cart']), ARRAY_A);
    // Перебераю массив
    foreach ($data as $key => $value) {
        // Узнаю общее количество товара
        $quantity_product += $value;
        // Узнаю цену и умножаю на колличество
        $price_product += get_field('price', $key) * $value;
    }

    // Вывожу колличество товара и сумму
    if(!$data){
        echo "Товаров 0 (0) тг.";
    } else {
        if($quantity_product == 1) {
            echo "$quantity_product товар ($price_product) тг.";
        } elseif($quantity_product > 1) {
            echo "Товаров: $quantity_product ($price_product) тг.";
        }
    }
    die();
}
Answer 1

Ответы на множественные запросы не обязательно придут в том порядке, в котором отправлены.

Проще всего запретить новый запрос, пока не отработан предыдущий, хотя это далеко не самое лучшее решение. Например, так:

var isWaiting;
//Обновление виджета корзины в шапке
function updateCart() {
    if (isWaiting) { return; }
    isWaiting = true;
    $.post('/wp-admin/admin-ajax.php',
        {
            action: 'updateCart'
        },
        function (res) {
            //Очистить флаг ожидания после успешного выполнения запроса
            isWaiting = false;
            $('.cart-btn').html(res);
        }
    ).fail(function(res) {
        //Очистить флаг ожидания при ошибке запроса
        isWaiting = false;
    });
}
updateCart();
READ ALSO
Какими методами можно вывести и как правильно выводить на страницу данные полученные от сервера в результате обработки Ajax запроса?

Какими методами можно вывести и как правильно выводить на страницу данные полученные от сервера в результате обработки Ajax запроса?

Я постараюсь описать как можно подробнее суть моей проблемы, что я пытаюсь сделать и что я уже пробовал сделать, итак

145
Как справиться с ошибкой [pool www] seems busy?

Как справиться с ошибкой [pool www] seems busy?

Помогите настроить PHP-FPM

152
Заменить символ в начале строки

Заменить символ в начале строки

Нужно реализовать следующее: Заменять английскую E на YE, если E стоит в начале любого слова в строке или после a, o, i, e, u, y

188