2017-02-25 41 views
2

我有一个函数来获取图像尺寸。我发送从createObjectURL返回。如何从此函数调用返回值?

它在取得尺寸时效果很好,但我无法取回数值。我试图获得这两个值,但问题似乎是函数内有一个函数。而外部函数不知道在内部函数中设置的值。当我硬编码一个值时,就像在下面的“qq”中一样。所以我可以看到问题不在于回报,而在于价值。

你在这种情况下如何读取值?

imgSrc = window.URL.createObjectURL(this.files[0]); 

var imgSize = getImgSize(imgSrc); 
var newWidth = imgSize.retWidth; 
var newHeight = imgSize.retHeight; 

alert(newWidth); 
alert(newHeight); 

function getImgSize(imgSrc) { 
    var newImg = new Image(); 

    newImg.onload = function() { 
    var nHeight = newImg.height; 
    var nWidth = newImg.width; 

    //alert('The image size is ' + width + '*' + height); 
    } 

    newImg.src = imgSrc; //this must be done AFTER setting onload 

    return { 
    retWidth: nWidth, 
    retHeight: 'qq' 
    }; 
} 
+1

您的变量'nHeight'和'nWidth'只存在于'onload'函数的范围内,请参见下面的答案。 –

+0

您可以使用'Promise',请参阅[列出页面上所有图像的文件大小(Chrome扩展)](http://stackoverflow.com/questions/41085017/list-file-sizes-of-all-images-on -a-page-chrome-extension/41085297?s = 2 | 0.1129#41085297),[在canvas.ToBlob()异步函数之外访问blob值)(http://stackoverflow.com/questions/42458849/access-blob -value-canvas-toblob-async-function /) – guest271314

回答

3

你不能让他们回来,因为.onload是异步处理,这是从负载处理程序中调用一个函数的最简单方法。

function getImage(){ 
    var imgSrc = window.URL.createObjectURL(this.files[0]); 
    getImgSize(imgSrc,useImgSize); 
} 

function getImgSize(src,fn){ 
    var img=new Image(); 
    img.onload=function(){ 
    fn({width:img.width,height:img.height}); 
    } 
    img.src=src; 
} 

function useImgSize(dimensions){ 
    alert(dimensions.width); 
    alert(dimensions.height); 
} 

这里我使用一个函数为每个步骤的过程。你有getImage开始这个过程。然后调用一个将图像源和回调函数作为参数的实用函数(您可以直接调用useImgSize函数,但回调函数允许您将实用函数用于多种用途)。最后,你可以在useImgSize函数中做任何你想要的尺寸。

+0

所以我在load handler中添加了一个函数nextStep,但nextStep做了什么?我会将值传递给该函数,但我仍然调用getImageSize ...不nextStep ...哪个接收值。我有点困惑......好吧,非常困惑。 – msith718

+0

我需要用完一段时间,但稍后会更仔细地看这个。我真的很感激反馈。 – msith718

+0

好的。所以,有点尴尬承认我还是不明白。但是......我把代码放进去了,它工作。我可以从useImageSize函数访问高度和宽度。我希望能够访问主要部分的值(在本例中为getImg),所以我可以调用例程来获取不同的原因大小,并用它做不同的事情。在这种情况下,我想我需要做任何需要useImageSize中的维度而不是主流程的任务,对吗? – msith718