2013-04-26 2 views
0

Я пытаюсь реализовать запрос AJAX как часть WebApplication. На стороне сервера требуется длительное время, чтобы обработать запрос полностью, но он может выводить отдельные элементы результата очень рано. Таким образом, я хочу, чтобы клиентская сторона отображала части ответа сразу же после их появления и не дожидалась завершения ответа.Обработка большого медленного входящего ответа ajax в реальном времени

Вот моя (упрощенный) на стороне сервера код:

for (myObj o : db.results()) { 
    // some rather slow operations at this place 
    JSONObject j = new JSONObject(); 
    j.put("tag1", o.tag1()); 
    j.put("tag2", o.tag2()); 
    System.out.println("Sending partial response: " + j.toString()); 
    response.getWriter().write(j.toString()); 
    response.getWriter().flush(); 
} 

Мой запрос JQuery на стороне клиента будет выглядеть примерно так:

$.ajax({ 
    type: "GET", 
    url: "queryURL", 
    dataType: "text", 
    success: function (data) { 
     alert("received " + data); 
    } 
}); 

К сожалению, успех-функция выполняется только один раз ответ выполнен. Я не мог найти способ выполнить функцию для каждого вызова response.getWriter().write(). Есть ли способ сделать это?

+0

Я думаю, вам нужно работать на стороне сервера и разделить ответ небольшими порциями. – Alepac

+0

Я не думаю, что есть способ сделать то, что вы просите, чтобы эффективно передавать ответ клиенту. Я думаю, что несколько вызовов ajax - лучшее, что вы получите. – Archer

+0

Перейти на веб-сайт или на длительный опрос. – pdegand59

ответ

0

Попытка реализовать реализацию типа «AJAX push» может быть очень сложной.

Проще всего это может означать, что вызов AJAX запускает процесс на сервере, но сервер записывает текущие результаты в какой-либо файл (т. Е. Как текст, xml, что угодно), поскольку он выполняет свою задачу. Ваш AJAX success/done может читать этот файл через определенный интервал (т.е. каждые 5 секунд), пока не достигнет конца файла.

Это не изящно ... но это просто и все работает!

+0

Мне не очень нравится этот подход, так как он добавляет накладные расходы на сервере и не очень изящный (как вы говорите). Я думаю, что я попробую обмен через websocket, как это было предложено pdegand59. – pitseeker

+0

Не беспокойтесь, это был еще один вариант рассмотрения. Я делал это так в прошлом, и он имеет тенденцию хорошо работать в определенных ситуациях (т. Е. Низкоуровневые компоненты, очень длинные процессы и т. Д.), Будучи очень простым в реализации. – cmallard

Смежные вопросы