2016-04-01 4 views
0

Ich erstelle einfache Upload-Formular (für. Zip-Dateien) und ich möchte überprüfen, ob Zip alle Dateien enthält, die später erforderlich sein werden.Rückgabe wahr/falsch von der asynchronen Funktion in synchronen if()

so habe ich eine Funktion 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; 
    } 

und ich benutze es in if(isZipCorrect()) vor XMLHttpRequest.

Ich nehme an, dass das Problem asynchrone Funktion (fileReader.onload) ist, die Operation beenden, wenn der gesamte Code bereits beendet ist. Aber ich möchte nicht send-Funktion von fileReader.onload aufrufen, denn für mich ist Zip-Korrektur muss optional sein (Sie sollten in der Lage sein, andere Dateien hochladen, die ohne Parsen gehen)

+0

So müssen Sie es brechen und rufen Sie den zweiten Abschnitt nach dem asynchronen Aufruf erfolgt. Sieh dir Versprechungen an – epascarello

Antwort

0

Sie jQuery.Deferred() verwenden könnte, so etwas zu tun:

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() 
}; 

und nennen Sie es wie folgt:

validateZipFile(file).done(submitForm).fail(handleBadZip); 

wo ‚submitForm‘ und ‚handleBadZip‘ sind Funktionen, die Sie vorher definiert haben

0

können Sie übergeben Callback-Funktion als Parameter an isZipCorrect und in Callback-Funktion können Sie mit Funktion senden:

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); 
} 
Verwandte Themen