从异步函数返回true/false以用于同步if()

Return true/false from asynchronous function to use in synchronous if()

本文关键字:同步 用于 if false 函数 异步 返回 true      更新时间:2023-11-08

我正在创建一个简单的上传表单(用于.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);
}