2016-08-09 54 views
0

我想對生成的Blob進行檢查,這需要我將自己的變量傳遞給回調函數。但是,toBlob() only passes the Blob。我如何將自己的變量傳遞給回調函數?或者,有沒有更好的方法來完成這個不涉及傳遞參數到回調?如何將參數傳遞給內置函數的回調函數? (即HTMLCanvasElement.toBlob)

試圖.bind後,我無法得到它的工作:

function handleCanvas(canvas, inputImage, file, quality, resolutionMultiplier) { 
    console.log(quality); 
    canvas.toBlob(processImage.bind(null, inputImage, file, quality, resolutionMultiplier), "image/jpeg", Math.max(quality, 1)/100) 
    } 

    function processImage(newBlob, inputImage, file, quality, resolutionMultiplier) { 
    console.log(quality); 
    } 

此打印出:

72 
0.5 

但他們都應該是72.自resolutionMultiplier爲0.5,所有參數似乎被移到了一個左邊。從toBlob我想要的blob根本不會被傳入processImage

最後編輯:找到了解決辦法,更直接的比我想象的要:

function handleCanvas(canvas, inputImage, file, quality, resolutionMultiplier) { 
    canvas.toBlob(function (newBlob) { 
     processImage(newBlob, inputImage, file, quality, resolutionMultiplier); 
    }, "image/jpeg", Math.max(quality, 1)/100) 
    } 
+0

你如何使用'toBlob()'?其他變量是什麼? –

+0

我想這取決於?你是否希望它只是一個polyfill,它從第一個條件看起來就像這樣,如果是這樣,它不應該與你正在填充的本地方法一致嗎?如果你想檢查某些東西,只需在回調中進行檢查? – adeneo

+0

@MattWay另一個變量是原始jpeg的文件大小。我用它來比較Blob是否變小。 – dtgq

回答

1

你的使用情況是不是從你的問題完全清楚,但一般你只需通過一個封閉傳遞自定義變量:

var oldSize = ...; 

function callback(blob) { 
    if (blob.size < oldSize) { 
     // take appropriate action 
    } 
} 

canvas.toBlob(callback); 

另一種可能是將oldSize作爲參數:

function callback(oldSize, blob) { 
    // ... 
} 

var oldSize = ...; 

canvas.toBlob(callback.bind(null, oldSize)); 
+0

'bind'正是我要找的,謝謝! – dtgq

+0

嘿,對不起[暫時]取回複選標記,但當我以這種方式使用它時,'.bind'不起作用。我已經更新了原始問題的細節,請你看看? – dtgq

+0

您期待'bind'將參數綁定到參數列表的末尾。它綁定到參數列表的開頭,所以'newBlob'需要是該函數的* last *參數。看我上面的例子。 – nrabinowitz

0
您回調

是,只透過新斑塊。

callback(new Blob([arr], {type: type || 'image/png'})) 

變化

callback(new Blob([arr], {type: type || 'image/png'}), your_value) 
+0

但我不能改變瀏覽器的本地功能,不幸的。 – dtgq

相關問題