Я разрабатываю приложение для выставления счетов.В настоящее время я использую OO php для создания invoice-объектов.Сами объекты содержат объекты для клиента, продукты, детали счета, фирмы.
Сейчас я работаю над страницей, чтобы сделать обзор.Проблема, которая возникла, была, когда у меня было слишком много счетов (протестировано только с 1500 фиктивными счетами, которые со временем могли быть намного больше), создание объектов php заняло около 7 секунд.Я чувствую, что это слишком долго, так как это только для одного запроса.Кроме того, поскольку php работает на сервере, страница ничего не загружала до того, как все объекты были построены.Я смотрел на пустой экран в течение 7 секунд, а затем мгновенно получил все (все на локальном хосте, поэтому в сети все должно быть хуже).
Поскольку на странице должно быть больше функциональности, чем просто бытьобзор (т.е. создание новых счетов-фактур, использование фильтров для сужения показанных счетов-фактур), и я не хочу, чтобы пользователю приходилось ждать, пока счета-фактуры будут построены, прежде чем они смогут использовать другие функции, я изменил способ работы страницы.
Теперь я сначала загружаю свою основную HTML-структуру и только потом начинаю получать данные моего счета с помощью вызова $ .ajax ().Я построил ajax_loader, чтобы уведомить пользователя о том, что что-то происходит.Когда вызов сделан, данные показываются, но у меня все еще есть проблема, что пользователь ничего не может сделать.Он может щелкнуть ссылку / кнопку или что-то еще, но это не «действует», пока мои вызовы ajax не будут завершены.После завершения звонков все работает.Нажатие на ссылку во время активного вызова регистрирует событие click, но триггер происходит только после выполнения ajax.
Проблема не имеет ничего общего с синхронизацией моих вызовов ajax или нет.Если у кого-то есть какие-либо предложения о том, как преодолеть эту проблему, я был бы очень признателен.Моими первыми мыслями было бы отменить ajaxcalls, но из того, что я читал до сих пор, я подозреваю, что функция abort () не выполнит свою работу.
edit: Выполнение еще нескольких попытокЯ заметил, что все работает, пока еще работают ajaxcall, за исключением загрузки страницы с моего собственного сайта (домена, сервера или как мне следует это называть) или выполнения любого другого ajaxcall, который использует тот же сервер, то есть:
$("#dummyButton").click(function(){
window.location='http://www.google.com' //works
window.location='index.php' //doesn't work
alert("test"); //works
console.log("test"); //works
})
a href='http://www.google.com' //works
a href='index.php' //doesnt work
Итак, я предполагаю, что сервер занят созданием объектов моего счета, поэтому он не будет принимать новый запрос.Следующее добавляет к этому выводу:
console.log("start slow call");
slow = $.ajax({
a very slow/heavy call
success:function(){
console.log('end slow call');
}
});
console.log('start fast call');
quick = $.ajax({
a very quick/lightweight call
success: function(){
console.log('end fast call');
}
});
Когда я делаю эти 2 вызова одновременно, быстрый вызов не завершится, пока не будет завершен медленный:
вывод на консоль:
start slow call
start fast call
end slow call
end fast call
при одновременном выполнении обоих вызовов быстрый вызов занимает 5 секунд (в соответствии с firebug), при выполнении только быстрого вызова, который он завершает за 150 мс
Я бы догадался,до этого все множественные ajaxcall будут выполняться параллельно вместо последовательных.
abort() function: (having my 2 ajaxcalls as globals so i can abort them);
$("a[href]").click(function(){
slow.abort();
quick.abort();
window.location = "index.php";
return false;
})
делает ajaxcalls прерванными, но все равно сервер продолжает выполнять код из обоихзвонки, следовательно, он не примет мой запрос на переход к index.php до тех пор, пока не будет завершен серверный код из ajaxcalls.
примерно через 5 секунд (считая в голове), мой index.php начнет загружаться
Поэтому на ум приходит следующий вопрос:
Есть ли какой-нибудь управляемый способ отменить все процессы, запущенные сервером для этого конкретного клиента?
Прочееghts, который не стал основной причиной:
Я уже настроил свой конструктор счета-фактуры, передав ему логическое значение, чтобы определить, нужна ли объекту вся информация или только базовая.Это сделало мой ajaxcall (или лучше процесс на стороне сервера за конкретным ajaxcall) примерно на 3 секунды короче (на 1500 фиктивных счетах).Я мог бы настроить базу данных и, следовательно, множество других вещей на уже разработанные вещи.Или, поскольку создание всех объектов счета-фактуры является трудоемкой частью, я мог бы просто сделать это не OO-способом?
Это меня немного огорчает: это был мой первый настоящий ООП-проект, с которым легко работать, но, очевидно, возникают большие проблемы с вычислением времени при работе с приличным количеством объектов.