我有以下代码:
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})
如何用传递给createThumb函数的参数替换硬编码的128大小字符串?
我假设我不能只添加附加参数,因为transformWrite属性需要一个具有特定3参数签名的函数。
答案 0 :(得分:2)
你可以尝试" Currying" 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 :(得分:2)
如果transformWrite
期望给定三个参数,则必须提供相应的功能。但是,您可以使用所需的大小参数创建这样的函数。
您需要的是一个创建另一个功能的功能:
var makeCreateThumb = function(param) {
return function(fileObj, readStream, writeStream) {
gm(readStream, fileObj.name())
.resize(param, param)
.stream()
.pipe(writeStream);
};
}
像这样使用:
var store = new FS.Store.GridFS("thumbs_128", {
transformWrite: makeCreateThumb('128')
})
答案 2 :(得分:0)
使用@TongShen建议的currying与bind
。
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 })
答案 3 :(得分:0)
第一个选项是返回一个函数。
function abc (_custom) {
return function (a, b, c) {
console.log(arguments, _custom);
}
}
var x = abc();
console.log(x(1,2,3));
另一种选择是使用bind
function abc (_custom, a,b,c) {
console.log(arguments);
}
var x = abc.bind(this, 128);
x(1,2,3)