【问题标题】:Wait for file reader to return me a true or false等待文件阅读器返回真假
【发布时间】:2018-03-08 11:02:14
【问题描述】:
function _validMimeType(file) {
        var validSignatures = ['ffd8ffe0', '89504e47', '424d3804', '49492a00', 
        '4d4d002a' , 'd0cf11e0', '504b0304', '74686973', '7b5c7274', '25504446', 
        '52617221'];
        var slice = file.slice(0, 4);  
        var reader = new FileReader();    
        reader.onloadend = function(e) {
            var view = new DataView(reader.result),
            signature;
            if(view.byteLength == 8){
                signature = view.getUint32(0, false).toString(16) + 
                view.getUint32(4, false).toString(16);
            } else {
               signature = view.getUint32(0, false).toString(16);
            }
            for (var i = 0; i < validSignatures.length; i++) {
               if (signature == validSignatures[i].toLowerCase()) {
                   console.log(signature);
                   return  true;
               }
           }
           return false;
        }
        reader.readAsArrayBuffer(slice); 
    }

_validMimeType(file) returns me undefined

当我将文件从上传者传递到 _validMimeType(file) 时,它返回给我未定义。

【问题讨论】:

  • 正确,因为您没有返回 _validMimeType 中的任何内容 - 并且要抢占下一个问题,请阅读 stackoverflow.com/questions/14220321/…
  • 因为这不是 ajax 调用。我需要它在 onloadend 函数结束时返回 true 或 false。我该怎么做
  • 你不能让_validMimeType同步返回一个值,因为它异步确定返回值......你需要学习使用异步技术(回调,承诺等) - 你阅读stackoverflow.com/questions/14220321/…?
  • 我需要等待文件阅读器返回真或假,因为未定义不会让我触发 ajax 调用。你能帮我在这里写一个回调函数吗
  • function _validMimeType(file, callback) { then 而不是 return true|false do return callback(true|false); ... 然后使用它_validMimeType(file, function(result) { ... do things with the result here ...})

标签: javascript file upload mime reader


【解决方案1】:

最简单的解决方案,因为 FileReader 是异步的,所以使用回调

function _validMimeType(file, callback) { // add callback argument
    var validSignatures = ['ffd8ffe0', '89504e47', '424d3804', '49492a00', 
    '4d4d002a' , 'd0cf11e0', '504b0304', '74686973', '7b5c7274', '25504446', 
    '52617221'];
    var slice = file.slice(0, 4);  
    var reader = new FileReader();    
    reader.onloadend = function(e) {
        var view = new DataView(reader.result),
        signature;
        if(view.byteLength == 8){
            signature = view.getUint32(0, false).toString(16) + 
            view.getUint32(4, false).toString(16);
        } else {
           signature = view.getUint32(0, false).toString(16);
        }
        for (var i = 0; i < validSignatures.length; i++) {
           if (signature == validSignatures[i].toLowerCase()) {
               console.log(signature);
               // change this
               return callback(true); // return so no fallthrough occurs
           }
       }
       // change this
       callback(false);
    }
    reader.readAsArrayBuffer(slice); 
}

_validMimeType(file, function(result) {
    // result is true or false
}

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 2016-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 2012-07-17
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多