我正在创建简单的上传表单(用于.zip文件),我想验证zip是否包含以后需要的所有文件。
所以我有一个函数isZipCorrect():
isZipCorrect = function() {
'use strict';
if (this.name.slice(-3) === 'zip') {
var fileReader = new FileReader();
var zip = new JSZip();
var shpCorrect = false;
fileReader.onload = function() {
var zip = new JSZip(this.result);
shpCorrect = zip.file(/.*?/).every(function(file) {
return (file.name.slice(-3) === 'shp' ||
file.name.slice(-3) === 'dbf' ||
file.name.slice(-3) === 'shx');
});
console.log(shpCorrect);
};
fileReader.readAsArrayBuffer(this.file);
return shpCorrect;
} else {
return true;
}
我在XMLHttpRequest之前在if(isZipCorrect())
中使用它。
我认为问题是异步函数(fileReader.onload),它在整个代码已经结束时结束操作。但是我不想从fileReader.onload调用send函数,因为对我来说检查是Zip正确必须是可选的(你应该能够上传其他文件而不经过'解析')
答案 0 :(得分:0)
你可以将一个回调函数作为参数传递给isZipCorrect,而在回调函数中你可以使用send函数:
isZipCorrect = function(callback) {
'use strict';
if (this.name.slice(-3) === 'zip') {
// all the existing code
fileReader.onload = function() {
var zip = new JSZip(this.result);
shpCorrect = zip.file(/.*?/).every(function(file) {
callback((file.name.slice(-3) === 'shp' ||
file.name.slice(-3) === 'dbf' ||
file.name.slice(-3) === 'shx'));
});
};
fileReader.readAsArrayBuffer(this.file);
//return shpCorrect;
} else {
callback(true);
}
答案 1 :(得分:0)
您可以使用jQuery.Deferred()执行以下操作:
validateZipFile = function(file) {
var
deferred = $.Deferred(),
fileReader = new FileReader();
fileReader.onload = function() {
var zip = new JSZip(this.result);
var isCorrect = zip.file(/.*?/).every(function(file) {
return /\.(shp|dbf|shx)$/i.test(file.name)
});
isCorrect ? deferred.resolve() : deferred.reject();
};
if( !/\.(zip)$/i.test(file.name) ) {
deferred.reject()
} else {
fileReader.readAsArrayBuffer(file)
}
return deferred.promise()
};
并称之为:
validateZipFile(file).done(submitForm).fail(handleBadZip);
其中'submitForm'和'handleBadZip'是您之前定义的函数