Я пытаюсь сделать ajax-вызовы в последовательности, а затем применить дескрипторы для добавления их в основной файл html. но мой код ниже подвешен только по первому запросу. когда я пытаюсь этот url вручную, он возвращает html. но не тогда, когда я пытаюсь. Я делаю любую логическую ошибку здесь.
var i = 0;
var flagArray = new Array(data.length);
while (i < data.length) {
if (flagArray[i] == 'done') {
i++;
console.log(i);
}
if (flagArray[i] != 'fired') {
flagArray[i] = 'fired';
$.get('commonCore/templates/' + data[i].templateHtml, function (html) {
console.log(data[count].classSelect, i);
var filterTemplate = Handlebars.compile(html);
replaceFilterTemplate(filterTemplate, data[i].classSelect);
flagArray[i] = 'done';
});
}
}
данные json:
[
{
"templateHtml": "dcdcsFilterOptions.html",
"classSelect": "dcdcsOptions"
},
{
"templateHtml": "dashBoardLeftInsight.html",
"classSelect": "leftpanel"
},
{
"templateHtml": "advanceFilterOptions.html",
"classSelect": "advancedOptions"
},
{
"templateHtml": "reportFilterOptions.html",
"classSelect": "reportdashboard"
}
]
в хромовой сети показывает ожидающий статус для первого запроса навсегда, и, следовательно, все висит. но manuall try возвращает данные.
Вы столкнулись с проблемой зависания сеанса из-за одновременной блокировки сеанса ajax-вызовов и блокировки файлов сеанса.
Пожалуйста, используйте функцию session_write_close(), прежде чем возвращать ответ, чтобы решить проблему, как описано здесь. http://php.net/manual/en/function.session-write-close.php
Это также улучшит производительность при одновременном вызове ajax, как показано в этом демо https://demo.ma.ttias.be/demo-php-blocking-sessions/.
Вот подробнее об этом. https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/
Если вы хотите сделать последовательные запросы, попробуйте что-то вроде
function request(array) {
if (!array || !a.length) {
return
}
var item = array.shift();
$.get('commonCore/templates/' + item.templateHtml, function (html) {
var filterTemplate = Handlebars.compile(html);
replaceFilterTemplate(filterTemplate, item.classSelect);
request(array)
});
}
request(data)
Проблема с вашим кодом до тех пор, пока весь массив запросов не будет обработан, вы блокируете поток браузера из-за цикла while
request
внутри обратного вызова?
flagArray[i]
не может быть установлен на'done'
иi
не увеличился. Есть ли конкретная причина, по которой вы хотите последовательно выполнять вызовы Ajax? Почему бы не запустить их параллельно?