我正在使用一个定制的 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 发布(除非有更好的方法)并在循环完成处理后处理确认消息?