Javascript在另一个函数中使用返回值

plo*_*cks 5 javascript jquery callback return-value deferred

我想要实现的是使用"previewfile"函数的返回值作为"readfiles"函数的执行指示器.但这需要在执行"image.onload"部分之后,因为我需要returnThis设置为true.我已经在谷歌和Stackoverflow上研究了一些关于这个问题和一般回调/延迟对象的事情,但是我不能在这种情况下如何应用它.

我的图片上传部分中有以下星座:

function previewfile(file, tests, acceptedTypes, holder) {
    var returnThis = false;                                                                               
    if (tests.filereader === true && acceptedTypes[file.type] === true) {                                                                
        var reader = new FileReader();                                                                                                   
        reader.onload = function (event) {                                                                                               
            var image = new Image();                                                                                
            image.onload = function() {                                                                                                  
                var testimage = new Image();                                                                                             
                testimage.src = $(this).attr('src');                                                                                     
                var widthOfImage = testimage.width;                                                                                      
                var heightOfImage = testimage.height;                                                                                    
                if (!checkImageDimensions(widthOfImage, heightOfImage)) {
                    // do stuff                                                  
                } else {
                    returnThis = true;                                                                                           
                }                                                                                                                        
            };                                                                                                                           
            image.src = event.target.result;                                                                                             
            holder.appendChild(image);                                                                                                   
        };                                                                                                                               
        reader.readAsDataURL(file);                                                                                                      
    }  else {                                                                                                                            
        // do other stuff                                                                                                              
    }                                                                                                                                    
    return returnThis;                                                                                                                   
}                                                                                                                                        
function readfiles(files, tests, acceptedTypes, holder, progress) {                                                                      
    var uploadNow = previewfile(files[0], tests, acceptedTypes, holder);                                                                   
    if (uploadNow === true) {                                                                                                               
        // do stuff                                                                                                          
        }                                                                                                                                
    } else {                                                                                                                             
        // do other stuff                                                                                                    
    }                                                                                                                                    
}                                                                                                       
Run Code Online (Sandbox Code Playgroud)

plo*_*cks 1

在 FelixKling 和 kallehj 的帮助下,这是可行的解决方案(带回调):

// important
function previewfile(file, tests, acceptedTypes, holder, callback) {
    var returnThis = false;                                                                               
    if (tests.filereader === true && acceptedTypes[file.type] === true) {                                                                
        var reader = new FileReader();                                                                                                   
        reader.onload = function (event) {                                                                                               
            var image = new Image();                                                                                
            image.onload = function() {                                                                                                  
                var testimage = new Image();                                                                                             
                testimage.src = $(this).attr('src');                                                                                     
                var widthOfImage = testimage.width;                                                                                      
                var heightOfImage = testimage.height;                                                                                    
                if (!checkImageDimensions(widthOfImage, heightOfImage)) {
                    // do stuff                                                  
                } else {
                    returnThis = true;                                                                                           
                }
                callback(returnThis);             // important                                                                                                           
            };                                                                                                                           
            image.src = event.target.result;                                                                                             
            holder.appendChild(image);                                                                                                   
        };                                                                                                                               
        reader.readAsDataURL(file);                                                                                                      
    }  else {                                                                                                                            
        callback(returnThis);                    // important                                                                                         
    }                                                                                                                  
}                                                                                                                                        
function readfiles(files, tests, acceptedTypes, holder, progress) {
    // important                                                                      
    previewfile(files[0], tests, acceptedTypes, holder, function (uploadNow) {
        if (uploadNow === true) {                                                                                                               
            // do stuff                                                                                                          
            }                                                                                                                                
        } else {                                                                                                                             
            // do other stuff                                                                                                    
        }                                                                                                                                    
    }        
});                                                                                               
Run Code Online (Sandbox Code Playgroud)