Вложенная / зацикливающаяся функция ajax либо приводит к сбою php, либо завершается успешно и останавливает пользовательский интерфейс сайта

У меня есть сайт php. Как только страница загружена, запускается ajax, затем при успешном завершении этого ajax он проходит по массиву и запускает ajax для каждого элемента в массиве.

Когда я делаю это как обычно (без использования ‘async: false‘, пользовательский интерфейс веб-сайта работает, как и ожидалось, но внутренняя обработка PHP является беспорядочной и не работает. Однако, когда я устанавливаю asynch в false для AJAX, пользовательский интерфейс зависает, но бэкэнд-обработка выполняется отлично.

Как я могу заставить ajax работать, перебирая массив, но убедившись, что он завершен, прежде чем продолжать цикл?

Вот моя чрезмерно упрощенная структура javascript / ajax:

//run once
$.ajax({ url: '/functions/myfile.php',
data: { blahblahblah },
type: 'post',
success: function(data){
var ajaxIDToConvert = [(array contents)];
var arrayLength = ajaxIDToConvert.length;
//loops
for (var i = 0; i < arrayLength; i++) {
var meh = ajaxIDToConvert[i];

$.ajax({ url : '/functions/myfile.php',
type : 'post',
async: false,
data : { blahblahblah},
success : function(convertdata) {
var convertResponse = JSON.parse(convertdata);
},
error: function (err) {
}
});
}
},
error: function (err) {

}
});

Вот пример выходных данных моего журнала PHP, когда не используется «async false», как вы видите, код php не работает:

Файл для конвертации: 527
Преобразование началось для 527: суббота, 06:30:06

Файл для конвертации: 523
Преобразование началось для 523: суббота, 06:30:06

Файл для конвертации: 522
Преобразование началось для 522: суббота, 06:30:06

Файл для конвертации: 524
Преобразование началось для 524: суббота, 06:30:06

Файл для конвертации: 526
Преобразование началось для 526: суббота, 06:30:06

Файл для конвертации: 525
Преобразование началось для 525: сб 06:30:06

Преобразование закончилось для 522: суббота, 06:30:38.
522 Не создано
преобразование
закончилась в 524: суббота 06:30:39 вечера
524 Не создано

Файл для конвертации: 528
Преобразование началось для 528: суббота, 06:30:39.

Файл для конвертации: 529
Преобразование началось для 529: суббота, 06:30:39.
Конвертация закончилась для 525: суббота, 06:30:40
525 Не создано
преобразование
закончилась в 523: суббота, 06:30:42
523 Не создано

и вот пример вывода PHP при использовании ‘asynch: false’:
(Это дает желаемый результат … но веб-страница зависает во время работы)

Файл для конвертации: 522
Преобразование началось для 522: суббота, 6:33:03
Преобразование закончилось для 522: суббота, 6:33:12 вечера.
522 Создано успешно

Файл для конвертации: 523
Преобразование началось для 523: суббота, 6:33:13 вечера.
Преобразование закончилось для 523: суббота, 6:33:22 вечера.
523 успешно создан

Файл для конвертации: 524
Преобразование началось для 524: сб 06:33:22
Преобразование закончилось для 524: суббота, 6:33:32 вечера.
524 успешно создан

Файл для конвертации: 525
Преобразование началось для 525: суббота, 6:33:32 вечера.
Преобразование закончилось для 525: суббота, 6:33:42 вечера.
525 успешно создано

Файл для конвертации: 526
Преобразование началось для 526: сб 06:33:42
Преобразование закончилось для 526: суббота 6:33:52 вечера
526 успешно создан

Я также попытался сделать следующее в скобках успеха первого ajax, но это приводит к тем же проблемам с выполнением php, что и первый вывод php выше:

var promises = [];
for (var i = 0; i < $total_files; i++){
/* $.ajax returns a promise*/
var request = $.ajax({
/* your ajax config*/
})

promises.push( request);
}

$.when.apply(null, promises).done(function(){
alert('All done')
})

0

Решение

Попробуйте что-то вроде этого:

var ajaxIDsToConvert = [1, 2, 3];
var deferred = $.Deferred();
var promise = deferred.promise();

$.each(ajaxIDsToConvert, function(index, id) {
promise = promise.pipe(function () {
return $.ajax({
// do required actions with `id` variable
});
});
});

deferred.resolve();
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector