Intereting Posts
PHP ASCII бронированная PGP зашифрованная строка preg_match все слова начинаются с @? PDO + MySQL и сломанная кодировка UTF-8 Наличие опции настраиваемых классов, но унифицированное имя класса Фильтровать сообщения WordPress по расстоянию между координатами mysql fetch связывает массив mysql fetch Получение «Запрещенной ошибки» при попытке выполнить API аналитики youtube Имена предметов исчезают при оформлении заказа в Magento Как предотвратить появление странных символов на веб-страницах Итерация многомерного массива рекурсивно и возврат той же структуры массива и вставка нового ключа / значений в PHP Внутренняя ошибка сервера (ошибка HTTP 500) после установки phpmyadmin в определенном домене CakePHP show project_id как имя Вопросительный знак PHP Facebook как пользовательский URL профиля PHP Запустите несколько команд exec сразу (но подождите, пока последний не завершится)

.ajax () не будет завершен до тех пор, пока предыдущий вызов .ajax () не будет завершен?

Итак, я работаю над индикатором выполнения сценария обработки CSV. dnc_scrubber.php проходит через CSV и проверяет номер телефона на базе базы данных, возвращая сопоставленные и несогласованные данные в отдельных файлах. lines.php возвращает общее количество строк для обработки, в то время как progress.php возвращает количество строк. Я использую эти два числа, чтобы создать процент работы, выполненной для функции progressbar jQuery.

Моя проблема в том, что первый .ajax() внутри doProgressBar() не заканчивается, пока не завершится вызов dnc_scrubber.php . Чтобы уточнить, при просмотре сетевого монитора в Chrome запрос выполняется в lines.php одновременно с запросом dnc_scrubber.php , но ответ не получен, пока dnc_scrubber.php закончит работу. Вот соответствующий код:

 $('#progressbar').progressbar(); $.ajax({ url: 'dnc_scrubber.php', type: 'POST', async: true, data: querystring, success: function(){ for (i = 0; i < files.length; i++){ $('#complete').append('<a href="process/MATCHED - ' + files[i] + '">MATCHED - ' + files[i] + '</a><br />'); $('#complete').append('<a href="process/SCRUBBED - ' + files[i] + '">SCRUBBED - ' + files[i] + '</a><br />'); } } }); function doProgressBar(){ $.ajax({ url: 'lines.php', async: true, dataType: 'json', complete: function (rez) { lines = JSON.parse(rez.responseText); lines = parseInt(lines.lines); console.log('dpg1 - lines: ' + lines); $.ajax({ url: 'progress.php', async: true, dataType: 'json', complete: function (rez1) { prog = JSON.parse(rez1.responseText); prog = parseInt(prog.progress); console.log('dpg2 - lines: ' + lines + ' prog: ' + prog); if (lines > prog){ var bar = (prog / lines) * 100; var bar = Math.round(bar); $('#progressbar').progressbar('option', 'value', bar); setTimeout(doProgressBar(), 1000); console.log('dpg3 - lines: ' + lines + ' prog: ' + prog + ' bar: ' + bar); } else if (lines == prog){ $('#progressbar').progressbar('option', 'value', 100); console.log('dpg3 - lines == prog'); } } }); } }); } setTimeout(doProgressBar(), 100); 

Это нормальная функциональность? Это то, что я пытаюсь сделать невозможным? Я в недоумении … заблаговременно за помощь

EDIT: lines.php

 session_start(); header('Content-type: application/json'); echo json_encode(array('lines' => $_SESSION['lines'])); 

progress.php

 session_start(); header('Content-type: application/json'); echo json_encode(array('progress' => $_SESSION['lines_processed'])); 

CSV-процессор увеличивает $_SESSION['lines_proccessed'] на один в конце процесса проверки для каждой строки

Related of ".ajax () не будет завершен до тех пор, пока предыдущий вызов .ajax () не будет завершен?"

Скорее всего, ваш сервер ограничивает количество одновременных подключений для каждого пользователя до 1. Или вы используете сеансы, а первый скрипт заблокирован. Второй скрипт будет заблокирован до тех пор, пока первый из них не заблокирует файл сеанса. Используйте только session_start() если вам нужно, и отпустите блокировку с помощью session_write_close() как только вы закончите с ней.

Изменить: я не уверен, что это сработает, но вы можете попробовать. Каждый раз, когда вы хотите обновить сеанс, вызовите session_start() , обновите сеанс, затем вызовите session_write_close() . Я не уверен, если вам разрешено делать это несколько раз в скрипте, но похоже, что он должен работать.

Не уверен, что это точная причина вашей проблемы, но это то, что нужно исправлять.

+ Изменить

 setTimeout(doProgressBar(), 100); 

к

 setTimeout(doProgressBar, 100); 

Вы вызываете doProgressBar сразу, а не после завершения таймаута.

Ajax будет assync.

lines.php , вероятно, ждет на dnc_scrubber.php поскольку первый заблокировал MySQL.

Это просто угадывание, поскольку у нас нет вашего PHP-кода, но попробуйте запустить оба скрипта PHP вручную и проверить, не lines.php ли lines.php что MySQL закончит.

при чтении вашего CSV-файла с помощью кода PHP он блокирует файл? поэтому, если он должен прочитать его дважды, он будет читать его только тогда, когда предыдущий код закрывает поток?

что произойдет, если вы откроете 2 браузера и запустите код одновременно? выполняются ли оба браузера одновременно с теми же результатами? или есть ожидание в файле?