[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: ajax как правильно организовать
123456
Пример.

Вся клиентская часть написана на js и работает на ajax.
Все действия происходят моментально.

Допустим вот пример изменения баланса пользователя:

// баланс хранится в таком виде
var user = {
balance : 1000
};


// функция изменения баланса
function editBalance (rur) {

user.balance += rur;

// дальше аякс запрос на изменение инфы на сервере
$.ajax();

}



Если пользователь выполнит editBalance (), ajax запрос не успеет выполниться, и вслед пользователь выполнит еще 10 раз эту функцию.

Как будут обрабатываться ajax запросы?

Они отправятся все по очереди(как стек) или же некоторые запросы могут не выполниться?
kaww
Цитата (123456 @ 28.09.2015 - 07:24)
Как будут обрабатываться ajax запросы?

Запрос будет отправлен при вызове editBalance, а вот ответ получен когда сервер сделает это (или не ответит), т.е. не обязательно в порядке, котором ты их отправил. Если сессия блокирующая (а по умолчанию именно такая), то, разумеется, запросы попадут в очередь на сервере и будут обработаны по очереди, но и это не гарантирует их доставку к серверу/клиенту в "твоем" порядке, т.к. различные задержки могут быть и на транспортном уровне. В общем нельзя надеется на это, а лучше не слать запросы, пока не получен ответ на предыдущий.
123456
может сделать стек запросов? И при обработке одного, проверять или имеются запросы в очереди, и если имеются, то выполнять их.
sergeiss
Цитата (123456 @ 28.09.2015 - 11:24)
user.balance += rur;

Это надо делать только по получении ответа от сервера. Отправил туда число 100, получил его обратно - только тогда увеличивай баланс. И надо контролировать как на стороне клиента, так и на стороне сервера, чтобы запросы в очередь выполнялись.
Цитата (123456 @ 28.09.2015 - 16:44)
И при обработке одного, проверять или имеются запросы в очереди, и если имеются, то выполнять их.

Если ты сделаешь проверку на клиентской стороне, то ее легко обойти будет.
Чтобы не использовать блокировки за счет сессий (неправильно это...), можно так сделать. Вот ушел запрос на сервер. Он обработался, ответ ушел клиенту. И в этом ответе поместить некий токен, связанный с этим ответом. При следующем запросе клиент должен отправить именно этот токен. В следующем ответе будет другой токен. И так далее. Сервер, пока не получит запрос с предыдущим токеном, тупо игнорирует все остальные запросы.
Таким образом можно сразу обойти много проблем, в т.ч. те, что описал kaww.


_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
AllesKlar
А в чем проблема вложить очередной запрос в обработчик ответа предыдущего?

_____________
[продано копирайтерам]
123456
sergeiss
надо, чтоб пользователю отображалось все моментально!
Чтоб не ждать ответа от сервера.

Если сервер не обработает запрос, то выдаст ошибку после обработки... (хоть через 20 секунд)
123456
AllesKlar
я про это и думаю.
Сделать стек, и по завершению одного аякса, вызывать следующий запрос из стека
AllesKlar
Цитата (123456 @ 29.09.2015 - 06:32)
AllesKlar
я про это и думаю.
Сделать стек, и по завершению одного аякса, вызывать следующий запрос из стека

Так а другого варианта и нет.
Можно, конечно, синхронно отправлять запросы, но тогда 99% браузер ляжет.

_____________
[продано копирайтерам]
123456
Первое, что пришло в голову!


	var ajaxQueue = []; // очередь ajax запросов

function ajaxQueueAdd(func)
{
$('#ajaxLoad').fadeIn(300); // визуальный индикатор загрузки

ajaxQueue.push(func);

if (ajaxQueue.length == 1)
ajaxQueueTake();
}

function ajaxQueueTake()
{
if (!ajaxQueue.length)
{
$('#ajaxLoad').fadeOut(300); // визуальный индикатор загрузки
return;
}

ajaxQueue.shift()();
}



каждый ajax запрос помещаем в очередь
ajaxQueueAdd(function(){$.ajax();});


и в каждом добавленном запросе прописываем
complete: function () { ajaxQueueTake(); },	



Еще не тестировал, но в моем случае, данный способ должен подойти.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.