2017-02-25 39 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