123456
28.09.2015 - 11:24
Пример.
Вся клиентская часть написана на js и работает на ajax.
Все действия происходят моментально.
Допустим вот пример изменения баланса пользователя:
var user = {
balance : 1000
};
function editBalance (rur) {
user.balance += rur;
$.ajax();
}
Если пользователь выполнит editBalance (), ajax запрос не успеет выполниться, и вслед пользователь выполнит еще 10 раз эту функцию.
Как будут обрабатываться ajax запросы?
Они отправятся все по очереди(как стек) или же некоторые запросы могут не выполниться?
Цитата (123456 @ 28.09.2015 - 07:24) |
Как будут обрабатываться ajax запросы? |
Запрос будет отправлен при вызове editBalance, а вот ответ получен когда сервер сделает это (или не ответит), т.е. не обязательно в порядке, котором ты их отправил. Если сессия блокирующая (а по умолчанию именно такая), то, разумеется, запросы попадут в очередь на сервере и будут обработаны по очереди, но и это не гарантирует их доставку к серверу/клиенту в "твоем" порядке, т.к. различные задержки могут быть и на транспортном уровне. В общем нельзя надеется на это, а лучше не слать запросы, пока не получен ответ на предыдущий.
123456
28.09.2015 - 16:44
может сделать стек запросов? И при обработке одного, проверять или имеются запросы в очереди, и если имеются, то выполнять их.
sergeiss
28.09.2015 - 22:59
Цитата (123456 @ 28.09.2015 - 11:24) |
user.balance += rur; |
Это надо делать только по получении ответа от сервера. Отправил туда число 100, получил его обратно - только тогда увеличивай баланс. И надо контролировать как на стороне клиента, так и на стороне сервера, чтобы запросы в очередь выполнялись.
Цитата (123456 @ 28.09.2015 - 16:44) |
И при обработке одного, проверять или имеются запросы в очереди, и если имеются, то выполнять их. |
Если ты сделаешь проверку на клиентской стороне, то ее легко обойти будет.
Чтобы не использовать блокировки за счет сессий (неправильно это...), можно так сделать. Вот ушел запрос на сервер. Он обработался, ответ ушел клиенту. И в этом ответе поместить некий токен, связанный с этим ответом. При следующем запросе клиент должен отправить именно этот токен. В следующем ответе будет другой токен. И так далее. Сервер, пока не получит запрос с предыдущим токеном, тупо игнорирует все остальные запросы.
Таким образом можно сразу обойти много проблем, в т.ч. те, что описал
kaww.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
AllesKlar
29.09.2015 - 01:10
А в чем проблема вложить очередной запрос в обработчик ответа предыдущего?
_____________
[продано копирайтерам]
123456
29.09.2015 - 08:31
sergeiss
надо, чтоб пользователю отображалось все моментально!
Чтоб не ждать ответа от сервера.
Если сервер не обработает запрос, то выдаст ошибку после обработки... (хоть через 20 секунд)
123456
29.09.2015 - 08:32
AllesKlar
я про это и думаю.
Сделать стек, и по завершению одного аякса, вызывать следующий запрос из стека
AllesKlar
29.09.2015 - 09:14
Цитата (123456 @ 29.09.2015 - 06:32) |
AllesKlar я про это и думаю. Сделать стек, и по завершению одного аякса, вызывать следующий запрос из стека |
Так а другого варианта и нет.
Можно, конечно, синхронно отправлять запросы, но тогда 99% браузер ляжет.
_____________
[продано копирайтерам]
Первое, что пришло в голову!
var ajaxQueue = [];
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(); },
Еще не тестировал, но в моем случае, данный способ должен подойти.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.