SSE остается в ожидании, пока работает AJAX - PullRequest
0 голосов
/ 20 сентября 2018

В моем проекте у меня есть длительный процесс, который вызывается AJAX.Продолжительность может составлять от 1 до 15 минут.

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

Я обнаружил, что есть несколько вариантов для реализации этого.Опрос, SSE или WebSockets.Я никогда не работал с WebSockets, и я не смог найти хороший пример.

Я сейчас пытаюсь с SSE, который я вполне понимаю, и он работает правильно ... но когда AJAX начинает устанавливать соединение сEventSource будет в ожидании.Поэтому во время работы AJAX обновления не принимаются.

Код:

    <script type="text/javascript">
var es;

function checkProgress(id){
    es = new EventSource('checkProgress.php');   
    es.addEventListener('message', function(e) {
        console.log(e.data);
        }, false);
}
checkProgress(1);   

    $(function() {
        $('.submit').on('click', function() {

                var form = $('form')[0];
                var form_data = new FormData(form);             

                $.ajax({
                    type: 'POST',
                    url: 'submit.php',
                    contentType: false,
                    processData: false,
                    data: form_data,
                    success:function(response) {
                       console.log(response);
                    }
                });

            return false;
        });
    });
</script>

Снимки экрана:

Сетевой журнал

На самом деле я до сих пор не нашел ни ссылки, ни примера того, как реализовать SSE, пока запущен процесс AJAX.Все ссылки или примеры приводят примеры, позволяющие файлу getProgress что-то делать.

1 Ответ

0 голосов
/ 20 сентября 2018

Я вижу, что вы используете PHP.Моим лучшим предположением будет то, что вы также используете встроенное управление сессиями PHP.Проблема в том, что доступ к сеансу является исключительной операцией.Я полагаю, что ваша операция AJAX открыла и заблокировала сеанс, не позволяя сценарию SSE также открывать сеанс.Вы могли бы рассмотреть не открытие сессии или открытие только для чтения .

...