Как сделать вызов AJAX до того, как загрузчик blueimp начнет загрузку нескольких файлов

Когда несколько файлов помещаются в зону сброса, мне нужно выполнить однократную подготовку на стороне сервера перед загрузкой отдельных файлов.

В идеале загрузчик должен иметь обратный вызов для инициализации нескольких файлов, который позволил бы мне сделать вызов ajax на мой сервер (где выполняется подготовка) и начать загрузку отдельных файлов только после возврата вызова подготовки.

Есть ли способ достичь этой цели?

В настоящее время мой код на стороне сервера (php), который запускается для каждого загружаемого файла, проверяет, была ли выполнена подготовка, и при необходимости запускает функцию подготовки. Но из-за того, что загрузчик асинхронно отправляет несколько файлов, возникает состояние гонки, и функция подготовки иногда вызывается несколько раз.

Это, конечно, возможно, но нет необходимости делать его синхронным. Если вам нужна помощь в устранении возможного состояния гонки, добавьте соответствующий код к вопросу.

Rory McCrossan 20.05.2019 21:53

Синхронный AJAX устарел, поэтому его следует избегать.

Barmar 20.05.2019 21:58

Отправьте запрос AJAX для подготовки и попросите функцию обратного вызова выполнить загрузку.

Barmar 20.05.2019 22:03

Спасибо за ответ. Я редактирую заголовок, чтобы удалить «синхронный». Проблема в том, что у загрузчика, похоже, нет обратного вызова, который запускается до начала загрузки отдельных файлов. Итак, я думаю, что @Barmar предлагает мне отказаться от «начинать загрузку автоматически» загрузчика и вместо этого запускать загрузку программно.

Stephen Aiena 20.05.2019 23:32

Да, это то, что я предлагаю.

Barmar 20.05.2019 23:44
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
5
393
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я смог решить свою проблему, следуя совету бармара и добавив кнопку для запуска загрузки.

Конкретные инструкции я нашел здесь: 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);
        });
});

Другие вопросы по теме