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' 是您之前定义的函数