Я использую настроенный пример plupload, где
- один или несколько файлов сначала загружаются в корзину Amazon S3, а
- тогда информация о файле + введенные пользователем данные (например, описание) отправляются
через ajax к моему действию контроллера в цикле.
Это действие контроллера затем проверяет, что файл был загружен в корзину S3, а затем сохраняет информацию в базе данных, возвращая успех или неудачу при вызове ajax.
Я использую событие UploadComplete, чтобы проверить наличие ошибок при загрузке, и, если их нет, выполнить фактические проверки POST в цикле.
Что я хотел бы сделать, так это подождать, пока весь цикл не завершит обработку, а затем отобразить подтверждающее сообщение (все успешно, все не удалось, сочетание обоих) соответственно.
Текущий код:
uploader.bind('UploadComplete', function (up, files) {
var errorsPresent = false;
var errors = '';
// re-enable buttons
$('div.plupload_buttons a').removeClass('disabled');
$.each(uploader.files, function (i, file) {
if (errorDescArray.hasOwnProperty(file.id)) {
errorsPresent = true;
errors += errorDescArray[file.id] + '<br />';
}
else if (file.status = plupload.DONE) {
var jqXhr = $.post('/documents/add', {
'__RequestVerificationToken': $('#__AjaxAntiForgeryForm input[name=__RequestVerificationToken]').val(),
'filename': file.name,
'size': file.size,
'location': $('#' + file.id + '_location').val(),
'description': $('#filedesc_text_' + file.id).text()
}).error(function (response) {
errorsPresent = true;
errors += response.responseText + '<br />';
});
}
});
//
if (errorsPresent) {
$('#uploadErrors').html('<div data-alert="alert" class="alert-message block-message fade in error"><a href="javascript:void(0)" class=\"close\">×</a><p>' + errors + '</p></div>');
}
else {
// set confirmation message
var message = files.length + ' file(s) were successfully uploaded.';
// clear file list
$('ul.plupload_filelist').html('');
// remove files from list
uploader.splice();
// hide modal
$('#upload-modal').modal('hide');
// show confirmation
$('#flashMessage').html('<div data-alert="alert" class="alert-message block-message fade in success"><a href="javascript:void(0)" class=\"close\">×</a><p>' + message + '</p></div>');
}
});
Вышесказанное явно имеет недостатки в том, что вторая половина фрагмента на самом деле не ожидает завершения POST, в результате чего отображается подтверждение успеха, даже если POST содержит ответ об ошибке.
Итак, мой вопрос заключается в следующем: как выполнить запись ajax в цикле (если нет лучшего способа) и обработать подтверждающее сообщение после завершения цикла?