Когда несколько файлов помещаются в зону сброса, мне нужно выполнить однократную подготовку на стороне сервера перед загрузкой отдельных файлов.
В идеале загрузчик должен иметь обратный вызов для инициализации нескольких файлов, который позволил бы мне сделать вызов ajax на мой сервер (где выполняется подготовка) и начать загрузку отдельных файлов только после возврата вызова подготовки.
Есть ли способ достичь этой цели?
В настоящее время мой код на стороне сервера (php), который запускается для каждого загружаемого файла, проверяет, была ли выполнена подготовка, и при необходимости запускает функцию подготовки. Но из-за того, что загрузчик асинхронно отправляет несколько файлов, возникает состояние гонки, и функция подготовки иногда вызывается несколько раз.
Синхронный AJAX устарел, поэтому его следует избегать.
Отправьте запрос AJAX для подготовки и попросите функцию обратного вызова выполнить загрузку.
Спасибо за ответ. Я редактирую заголовок, чтобы удалить «синхронный». Проблема в том, что у загрузчика, похоже, нет обратного вызова, который запускается до начала загрузки отдельных файлов. Итак, я думаю, что @Barmar предлагает мне отказаться от «начинать загрузку автоматически» загрузчика и вместо этого запускать загрузку программно.
Да, это то, что я предлагаю.
Я смог решить свою проблему, следуя совету бармара и добавив кнопку для запуска загрузки.
Конкретные инструкции я нашел здесь: https://stackoverflow.com/a/38236305/671669
Теперь я включаю этот код в инициализацию плагина blueimp jQuery-File-Upload:
add: function (e, data) {
// enable the upload button
$("#fileupload-start-button").prop('disabled', false);
// wait for button click to process
$("#fileupload-start-button").on('xyzUploadTrigger', function (e) {
data.submit();
});
},
А моя привязка к кнопке "Начать загрузку" выглядит так:
$("#fileupload-start-button").on('click', function (e) {
$(this).prop('disabled', true)
e.preventDefault();
// prepare server-side for upload of resources
axios.post('/resources/initResourceCollectionForUploader',
{
'params': params,
})
.then(function (response) {
// hide the upload button and trigger it
$("#fileupload-controls-container").addClass('d-none');
$("#fileupload-start-button").trigger('xyzUploadTrigger');
})
.catch(function (error) {
console.info(error);
});
});
Это, конечно, возможно, но нет необходимости делать его синхронным. Если вам нужна помощь в устранении возможного состояния гонки, добавьте соответствующий код к вопросу.