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

时间:2016-04-01 13:16:56

标签: javascript ajax asynchronous jszip

我正在创建简单的上传表单(用于.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正确必须是可选的(你应该能够上传其他文件而不经过'解析')

2 个答案:

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