Return true/false 从异步函数在同步 if() 中使用
Return true/false from asynchronous function to use in synchronous if()
我正在创建简单的上传表单(用于 .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 调用发送函数,因为对我来说检查 Zip 是否正确必须是可选的(你应该能够上传其他文件,这些文件将在没有 'parsing' 的情况下通过)
您可以将回调函数作为参数传递给 isZipCorrect,在回调函数中您可以使用发送函数:
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);
}
您可以使用 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' 是您之前定义的函数
我正在创建简单的上传表单(用于 .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 调用发送函数,因为对我来说检查 Zip 是否正确必须是可选的(你应该能够上传其他文件,这些文件将在没有 'parsing' 的情况下通过)
您可以将回调函数作为参数传递给 isZipCorrect,在回调函数中您可以使用发送函数:
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);
}
您可以使用 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' 是您之前定义的函数