2016-04-01 104 views
0

我正在創建簡單的上載表單(對於.zip文件),並且我想驗證zip是否包含稍後將需要的所有文件。從異步函數返回true/false以用於同步if()

所以我有一個函數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正確的必須是可選的(你應該能夠上傳其他文件,這將通過而不''解析')

+0

所以,你需要打破它,並調用第二部分中的異步調用完成後發揮作用。看看承諾 – epascarello

回答

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」是您以前定義

0

你可以通過回調函數作爲參數傳遞給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); 
}