2015-12-22 215 views
4

我有以下代碼:JS傳遞額外的參數功能

var createThumb128 = function(fileObj, readStream, writeStream) { 
     gm(readStream, fileObj.name()).resize('128', '128').stream().pipe(writeStream); 
    }; 

    var store = new FS.Store.GridFS("thumbs_128", { transformWrite: createThumb128}) 

我怎麼能代替硬編碼的128名尺寸的字符串與我傳遞給createThumb函數的參數?

我認爲我不能只是添加額外的參數,因爲transformWrite屬性需要一個具有特定3參數簽名的函數。

回答

2

你可以試試「討好」 https://en.wikipedia.org/wiki/Currying

var createThumb = function(size) { 
    return function(fileObj, readStream, writeStream) { 
     gm(readStream, fileObj.name()).resize(size, size).stream().pipe(writeStream); 
    }; 
} 

var store = new FS.Store.GridFS("thumbs_128", { transformWrite: createThumb('128')}) 
+1

這是在代碼方面一個很好的答案使用,但不討好的實際功能。 –

+0

正確的,currying會將一個4參數函數變成幾個更小的函數。在這裏,您只需使用createThumb生成函數。它解決了這個問題,但它不是曲解。 – lex82

2

如果transformWrite預計給定的三個參數,你必須提供相應的功能。但是,您可以使用所需的大小參數創建這樣的功能。

你需要的是一個創建另外一個函數的函數:由@TongShen建議

var store = new FS.Store.GridFS("thumbs_128", { 
    transformWrite: makeCreateThumb('128') 
}) 
+0

Bonus upvote用於改進原始代碼的格式。 –

0

使用currying, - 與bind

var makeCreateThumb = function(param) { 
    return function(fileObj, readStream, writeStream) { 
     gm(readStream, fileObj.name()) 
      .resize(param, param) 
      .stream() 
      .pipe(writeStream); 
    }; 
} 

使用方法如下。

bind允許你採取一個函數n參數,與bind即可獲贈n-x功能,您可以在固定第一n

對於你的情況,使它成爲一個4參數功能:

var createThumb128 = function(len, fileObj, readStream, writeStream) { 
     gm(readStream, fileObj.name()).resize(len, len).stream().pipe(writeStream); 
    }; 

然後創建一個3參數複製,固定'128'長度,併發送:

var lengthFixed128 = createThumb128 .bind(undefined, '128'); //first argument binds to a context, can be left undefined for our purpose 

var store = new FS.Store.GridFS("thumbs_128", { transformWrite: lengthFixed128 }) 
0

第一個選項是返回一個函數。

function abc (_custom) { 
    return function (a, b, c) { 
     console.log(arguments, _custom); 
    } 
} 

var x = abc(); 
console.log(x(1,2,3)); 

另一種選擇是綁定

function abc (_custom, a,b,c) { 
    console.log(arguments); 
} 

var x = abc.bind(this, 128); 
x(1,2,3) 
+0

我看到其他人在我喝了一杯咖啡時做出了這些答案...... – epascarello