从异步函数返回true/false以用于同步if()
Return true/false from asynchronous function to use in synchronous if()
我正在创建一个简单的上传表单(用于.zip文件),我想验证zip是否包含稍后需要的所有文件。
所以我有一个函数是ZipCorrect():
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之前在CCD_ 1中使用它。
我认为问题出在异步函数(fileReader.onload)上,当整个代码已经结束时,它会结束操作。但我不想从fileReader.onload调用send函数,因为对我来说,检查Zip是否正确必须是可选的(你应该能够上传其他文件,这些文件将在没有"解析"的情况下通过)
您可以使用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"answers"handleBadZip"是您之前定义的函数
您可以将回调函数作为参数传递给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);
}
相关文章:
- 将函数的上下文应用于javascript变量
- keyup事件处理程序更改焦点不适用于快速键入
- Chrome扩展程序,用于将文件与USB驱动器同步
- 从异步函数返回true/false以用于同步if()
- jQuery Deferred和Promise用于同步和异步函数的顺序执行
- 用于节点的FTP模块.js可以同步文件
- 同步 jQuery setInterval 用于幻灯片放映
- Require.js是否有用于加载单个依赖项的同步版本
- 用于缓存的Node.js同步请求
- 用于数据库的Jquery ajax同步调用
- 我可以告诉浏览器同步始终使用一个.html文件吗?(用于html5模式链接)
- NodeJs,用于同步开发的模式
- 用于在客户端和node.js服务器之间同步数据的JavaScript库
- 用于Web应用程序开发的IDE,使本地代码和服务器代码保持同步
- 将资源与 Google 日历同步,用于节点.js
- Backbone 中的 2 种保存方法(同步).js - 一种用于持久化,另一种是最终的完整方法
- XMLhttpRequest for PDF 文件适用于同步,但不适用于异步
- 任何可用于自动同步.js文件的工具
- 在JavaScript中设置游标,用于长时间的同步操作
- 用于包装异步JavaScript函数以使其同步的模式